================================================================================
MANUAL APACHE HADOOP - NIVELES 1 Y 2
Anexo: Capitulo 7 - Instalacion y Configuracion Basica
Capitulo 8 - Ejercicios Practicos
================================================================================
════════════════════════════════════════════════════════════════════════════════
NIVEL 2 - CAPITULO 7: INSTALACION Y CONFIGURACION BASICA
════════════════════════════════════════════════════════════════════════════════
En este capitulo vemos como instalar Hadoop en modo pseudo-distribuido (una sola
maquina que simula un cluster). Es el entorno ideal para aprender antes de
trabajar con un cluster real.
────────────────────────────────────────────────────────────────────────────────
7.1 Modos de ejecucion de Hadoop
────────────────────────────────────────────────────────────────────────────────
Hadoop puede ejecutarse en tres modos segun el entorno:
Local (Standalone)
Todo corre en un solo proceso Java, sin HDFS. Se usa para debugging rapido.
Ideal para: Desarrollo y testing.
Pseudo-distribuido
Un solo nodo pero con HDFS y YARN activos como si fuera un cluster real.
Ideal para: Aprendizaje y desarrollo.
Totalmente distribuido
Multiples nodos reales o VMs. Es el entorno productivo.
Ideal para: Produccion.
────────────────────────────────────────────────────────────────────────────────
7.2 Pre-requisitos
────────────────────────────────────────────────────────────────────────────────
Para instalar Hadoop se necesita:
- Java JDK 8 o 11 (Hadoop esta escrito en Java)
- SSH configurado para login sin password
(Hadoop se conecta a sus propios nodos via SSH)
- Al menos 4 GB de RAM para modo pseudo-distribuido
- Sistema operativo Linux o macOS
(en Windows se usa WSL2 o Docker)
Comandos para verificar e instalar Java y configurar SSH:
┌─────────────────────────────────────────────────────────────────────────┐
│ # Verificar Java instalado │
│ java -version │
│ # Deberia mostrar: openjdk version '11.x.x' o '1.8.x' │
│ │
│ # Instalar Java (Ubuntu/Debian) │
│ sudo apt update │
│ sudo apt install openjdk-11-jdk -y │
│ │
│ # Configurar SSH sin password (para el propio host) │
│ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa │
│ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys │
│ chmod 0600 ~/.ssh/authorized_keys │
│ │
│ # Verificar SSH local │
│ ssh localhost │
└─────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────
7.3 Descarga e instalacion
────────────────────────────────────────────────────────────────────────────────
┌─────────────────────────────────────────────────────────────────────────┐
│ # Descargar Hadoop 3.3.x desde Apache │
│ wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/ │
│ hadoop-3.3.6.tar.gz │
│ │
│ # Descomprimir │
│ tar -xzf hadoop-3.3.6.tar.gz │
│ sudo mv hadoop-3.3.6 /usr/local/hadoop │
│ │
│ # Configurar variables de entorno en ~/.bashrc │
│ export HADOOP_HOME=/usr/local/hadoop │
│ export HADOOP_INSTALL=$HADOOP_HOME │
│ export HADOOP_MAPRED_HOME=$HADOOP_HOME │
│ export HADOOP_COMMON_HOME=$HADOOP_HOME │
│ export HADOOP_HDFS_HOME=$HADOOP_HOME │
│ export YARN_HOME=$HADOOP_HOME │
│ export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native │
│ export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin │
│ export JAVA_HOME=$(readlink -f /usr/bin/java | sed 's:/bin/java::') │
│ │
│ # Aplicar los cambios │
│ source ~/.bashrc │
│ │
│ # Verificar instalacion │
│ hadoop version │
└─────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────
7.4 Archivos de configuracion clave
────────────────────────────────────────────────────────────────────────────────
Hadoop se configura a traves de archivos XML ubicados en:
$HADOOP_HOME/etc/hadoop/
Los mas importantes son:
>> core-site.xml — URI del filesystem y configuracion base
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ │
│ fs.defaultFS │
│ hdfs://localhost:9000 │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
>> hdfs-site.xml — Factor de replicacion y rutas de datos
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ │
│ dfs.replication │
│ 1 │
│ │
│ │
│ dfs.namenode.name.dir │
│ /usr/local/hadoop/data/namenode │
│ │
│ │
│ dfs.datanode.data.dir │
│ /usr/local/hadoop/data/datanode │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
>> yarn-site.xml — Configuracion del ResourceManager
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ │
│ yarn.nodemanager.aux-services │
│ mapreduce_shuffle │
│ │
│ │
│ yarn.nodemanager.env-whitelist │
│ │
│ JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME, │
│ HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE, │
│ HADOOP_YARN_HOME,HADOOP_MAPRED_HOME │
│ │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────
7.5 Iniciar y detener el cluster
────────────────────────────────────────────────────────────────────────────────
┌─────────────────────────────────────────────────────────────────────────┐
│ # Formatear el NameNode (solo la primera vez) │
│ hdfs namenode -format │
│ │
│ # Iniciar HDFS (NameNode + DataNode) │
│ start-dfs.sh │
│ │
│ # Iniciar YARN (ResourceManager + NodeManager) │
│ start-yarn.sh │
│ │
│ # Verificar que todos los procesos esten corriendo │
│ jps │
│ # Deberia mostrar: │
│ # NameNode │
│ # DataNode │
│ # SecondaryNameNode │
│ # ResourceManager │
│ # NodeManager │
│ │
│ # Interfaces web disponibles: │
│ # HDFS NameNode UI: http://localhost:9870 │
│ # YARN ResourceManager UI: http://localhost:8088 │
│ │
│ # Detener todo │
│ stop-yarn.sh │
│ stop-dfs.sh │
└─────────────────────────────────────────────────────────────────────────┘
════════════════════════════════════════════════════════════════════════════════
NIVEL 2 - CAPITULO 8: EJERCICIOS PRACTICOS CON CLOUDERA VM
════════════════════════════════════════════════════════════════════════════════
En este capitulo practicamos todo lo aprendido en un entorno real: la Cloudera
QuickStart VM corriendo sobre VMware Workstation Player 17. Usamos el dataset
completo de TechStore (los mismos CSVs de la serie de manuales JAVIESCA) y
ejecutamos el flujo completo HDFS -> Hive via la interfaz web Hue.
Entorno verificado:
- VMware Workstation Player 17 con Cloudera QuickStart VM (CDH 5.x)
- Hue: http://quickstart.cloudera:8888 | login: cloudera / cloudera
- 6 CSVs del dataset TechStore en /home/cloudera/datasets/
- HDFS activo: hdfs dfs -ls / devuelve /benchmarks /hbase /solr /tmp /user /var
Archivos de descarga disponibles en javiesca.com:
- Cloudera QuickStart VM (5 GB - VMware .vmx)
- clientes.csv (50.000 filas)
- productos.csv (5.000 filas)
- pedidos_1M.csv (1.000.000 filas)
- pagos.csv (~950.000 filas)
────────────────────────────────────────────────────────────────────────────────
8.1 Crear la estructura de directorios HDFS
────────────────────────────────────────────────────────────────────────────────
Hive necesita que cada tabla apunte a su propio directorio en HDFS.
Desde la terminal de Cloudera:
┌─────────────────────────────────────────────────────────────────────────┐
│ # Crear un directorio por tabla │
│ hdfs dfs -mkdir -p /techstore/raw/clientes │
│ hdfs dfs -mkdir -p /techstore/raw/productos │
│ hdfs dfs -mkdir -p /techstore/raw/pedidos │
│ hdfs dfs -mkdir -p /techstore/raw/pagos │
│ │
│ # Verificar │
│ hdfs dfs -ls /techstore/raw/ │
└─────────────────────────────────────────────────────────────────────────┘
Resultado esperado:
Found 4 items
drwxr-xr-x - cloudera supergroup 0 ... /techstore/raw/clientes
drwxr-xr-x - cloudera supergroup 0 ... /techstore/raw/pagos
drwxr-xr-x - cloudera supergroup 0 ... /techstore/raw/pedidos
drwxr-xr-x - cloudera supergroup 0 ... /techstore/raw/productos
────────────────────────────────────────────────────────────────────────────────
8.2 Subir los CSVs a HDFS
────────────────────────────────────────────────────────────────────────────────
Con los 4 CSVs en /home/cloudera/datasets/, los subimos a sus directorios:
┌─────────────────────────────────────────────────────────────────────────┐
│ hdfs dfs -put /home/cloudera/datasets/clientes.csv │
│ /techstore/raw/clientes/ │
│ │
│ hdfs dfs -put /home/cloudera/datasets/productos.csv │
│ /techstore/raw/productos/ │
│ │
│ hdfs dfs -put /home/cloudera/datasets/pedidos_1M.csv │
│ /techstore/raw/pedidos/ │
│ # Nota: pedidos_1M tiene 1 millon de filas, puede tardar unos segundos │
│ │
│ hdfs dfs -put /home/cloudera/datasets/pagos.csv │
│ /techstore/raw/pagos/ │
│ │
│ # Verificar el header de pedidos para confirmar la carga │
│ hdfs dfs -cat /techstore/raw/pedidos/pedidos_1M.csv | head -2 │
└─────────────────────────────────────────────────────────────────────────┘
Resultado esperado del head -2:
pedido_id,cliente_id,producto_id,fecha_pedido,cantidad,precio_unitario,
descuento_pct,monto_bruto,monto_descuento,monto_total,estado,canal,region,tiempo_entrega
1,23451,3812,2022-03-15,2,18500.00,10,37000.00,3700.00,33300.00,ENTREGADO,WEB,AMBA,3
────────────────────────────────────────────────────────────────────────────────
8.3 Crear la base de datos y tablas en Hive (via Hue)
────────────────────────────────────────────────────────────────────────────────
Desde el editor Hive de Hue (Query -> Editor -> Hive), ejecutar de a una
sentencia con el boton Play o Ctrl+Enter:
┌─────────────────────────────────────────────────────────────────────────┐
│ -- Crear base de datos │
│ CREATE DATABASE IF NOT EXISTS techstore │
│ COMMENT 'Dataset e-commerce TechStore'; │
│ │
│ USE techstore; │
│ │
│ -- Tabla clientes (50.000 filas) │
│ CREATE EXTERNAL TABLE IF NOT EXISTS clientes ( │
│ cliente_id INT, │
│ nombre STRING, │
│ email STRING, │
│ pais STRING, │
│ region STRING, │
│ ciudad STRING, │
│ segmento STRING, │
│ fecha_alta STRING, │
│ genero STRING, │
│ activo INT │
│ ) │
│ ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' │
│ STORED AS TEXTFILE │
│ LOCATION '/techstore/raw/clientes/' │
│ TBLPROPERTIES ('skip.header.line.count'='1'); │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ │
│ -- Tabla productos (5.000 filas) │
│ CREATE EXTERNAL TABLE IF NOT EXISTS productos ( │
│ producto_id INT, │
│ nombre STRING, │
│ categoria STRING, │
│ subcategoria STRING, │
│ marca STRING, │
│ precio_base DOUBLE, │
│ costo DOUBLE, │
│ activo INT │
│ ) │
│ ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' │
│ STORED AS TEXTFILE │
│ LOCATION '/techstore/raw/productos/' │
│ TBLPROPERTIES ('skip.header.line.count'='1'); │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ │
│ -- Tabla pedidos (1.000.000 filas) │
│ CREATE EXTERNAL TABLE IF NOT EXISTS pedidos ( │
│ pedido_id INT, │
│ cliente_id INT, │
│ producto_id INT, │
│ fecha_pedido STRING, │
│ cantidad INT, │
│ precio_unitario DOUBLE, │
│ descuento_pct INT, │
│ monto_bruto DOUBLE, │
│ monto_descuento DOUBLE, │
│ monto_total DOUBLE, │
│ estado STRING, │
│ canal STRING, │
│ region STRING, │
│ tiempo_entrega INT │
│ ) │
│ ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' │
│ STORED AS TEXTFILE │
│ LOCATION '/techstore/raw/pedidos/' │
│ TBLPROPERTIES ('skip.header.line.count'='1'); │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ │
│ -- Tabla pagos (~950.000 filas) │
│ CREATE EXTERNAL TABLE IF NOT EXISTS pagos ( │
│ pago_id INT, │
│ pedido_id INT, │
│ cliente_id INT, │
│ fecha_pago STRING, │
│ monto_pagado DOUBLE, │
│ metodo_pago STRING, │
│ cuotas INT, │
│ estado_pago STRING │
│ ) │
│ ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' │
│ STORED AS TEXTFILE │
│ LOCATION '/techstore/raw/pagos/' │
│ TBLPROPERTIES ('skip.header.line.count'='1'); │
│ │
│ -- Confirmar las 4 tablas │
│ SHOW TABLES; │
└─────────────────────────────────────────────────────────────────────────┘
NOTA: EXTERNAL TABLE = si haces DROP TABLE, los datos en HDFS NO se borran.
Es la convencion correcta para datos raw que llegan de otros sistemas.
────────────────────────────────────────────────────────────────────────────────
8.4 Consultas HiveQL sobre TechStore
────────────────────────────────────────────────────────────────────────────────
Ejecutar desde el editor Hive de Hue. Cada consulta se traduce a un job de
MapReduce visible en http://quickstart.cloudera:8088 mientras corre.
Las consultas sobre pedidos (1M filas) pueden tardar entre 30 segundos y 2 min.
-- Q01: Conteo de filas por tabla
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ SELECT 'clientes' AS tabla, COUNT(*) AS filas FROM clientes UNION ALL│
│ SELECT 'productos' AS tabla, COUNT(*) AS filas FROM productos UNION ALL│
│ SELECT 'pedidos' AS tabla, COUNT(*) AS filas FROM pedidos UNION ALL│
│ SELECT 'pagos' AS tabla, COUNT(*) AS filas FROM pagos; │
└─────────────────────────────────────────────────────────────────────────┘
Resultado esperado: clientes 50000 | productos 5000 | pedidos 1000000 | pagos ~950000
-- Q02: Distribucion de clientes por segmento
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ SELECT segmento, │
│ COUNT(*) AS cantidad, │
│ ROUND(COUNT(*) * 100.0 / 50000, 1) AS porcentaje │
│ FROM clientes │
│ GROUP BY segmento │
│ ORDER BY cantidad DESC; │
└─────────────────────────────────────────────────────────────────────────┘
-- Q03: Ventas totales por canal (excluyendo cancelados)
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ SELECT canal, │
│ COUNT(*) AS pedidos, │
│ ROUND(SUM(monto_total), 2) AS venta_total, │
│ ROUND(AVG(monto_total), 2) AS ticket_promedio │
│ FROM pedidos │
│ WHERE estado != 'CANCELADO' │
│ GROUP BY canal │
│ ORDER BY venta_total DESC; │
└─────────────────────────────────────────────────────────────────────────┘
-- Q04: Ventas por categoria de producto (JOIN)
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ SELECT pr.categoria, │
│ COUNT(pe.pedido_id) AS pedidos, │
│ ROUND(SUM(pe.monto_total),2) AS venta_total │
│ FROM pedidos pe │
│ JOIN productos pr ON pe.producto_id = pr.producto_id │
│ WHERE pe.estado != 'CANCELADO' │
│ GROUP BY pr.categoria │
│ ORDER BY venta_total DESC; │
└─────────────────────────────────────────────────────────────────────────┘
-- Q05: Resumen ejecutivo — monto pedido vs cobrado por region
┌─────────────────────────────────────────────────────────────────────────┐
│ USE techstore; │
│ SELECT pe.region, │
│ COUNT(DISTINCT pe.pedido_id) AS pedidos, │
│ ROUND(SUM(pe.monto_total),2) AS monto_pedido, │
│ ROUND(SUM(pa.monto_pagado),2) AS monto_cobrado, │
│ ROUND( │
│ SUM(pa.monto_pagado) * 100.0 / SUM(pe.monto_total) │
│ , 1) AS pct_cobrado │
│ FROM pedidos pe │
│ JOIN pagos pa ON pe.pedido_id = pa.pedido_id │
│ WHERE pe.estado != 'CANCELADO' │
│ AND pa.estado_pago = 'APROBADO' │
│ GROUP BY pe.region │
│ ORDER BY monto_cobrado DESC; │
└─────────────────────────────────────────────────────────────────────────┘
Verificar jobs en YARN mientras corren las consultas:
http://quickstart.cloudera:8088 -> YARN ResourceManager UI
http://quickstart.cloudera:50070 -> HDFS NameNode UI
────────────────────────────────────────────────────────────────────────────────
PROXIMOS PASOS RECOMENDADOS
────────────────────────────────────────────────────────────────────────────────
Impala: Ejecutar las mismas consultas en el editor Impala de Hue
y comparar la velocidad con Hive.
Spark SQL: Conectarse al shell de PySpark y consultar los mismos datos
en memoria (mucho mas rapido que MapReduce).
Oozie: Crear un workflow que encadene la carga a HDFS y las
consultas Hive de forma orquestada (similar a Control-M).
Performance: Convertir las tablas de TEXTFILE a ORC o Parquet para
mejorar velocidad y reducir espacio en HDFS.
Nivel 3: Administracion de Hadoop
(Alta disponibilidad, monitoreo con Cloudera Manager)
Certif.: Cloudera CCA Data Analyst | Hortonworks HDPCD
================================================================================
Manual Apache Hadoop | Version 1.0 | Junio 2026
Elaborado para formacion interna.
Nivel 1 (Fundamentos) y Nivel 2 (Arquitectura y Ecosistema).
================================================================================