================================================================================ 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). ================================================================================