Diseño de la Topología del Clúster
Para garantizar la tolerancia a fallos y la escalabliidad, esta implementación utiliza una arquitectura de Alta Disponibilidad (HA) sobre la distribución CDH5. El entorno consta de cinco nodos físicos o virtuales, segregando los roles de gestión (NameNode y ResourceManager) de los roles de trabajo y coordinación (DataNode, NodeManager y ZooKeeper).
Planificación de Nodos
| Dirección IP | Hostname | Roles Asignados | Demonios Principales |
|---|---|---|---|
| 10.0.1.10 | master-01 | NameNode, ResourceManager | NameNode, DFSZKFailoverController, ResourceManager |
| 10.0.1.11 | master-02 | NameNode, ResourceManager | NameNode, DFSZKFailoverController, ResourceManager |
| 10.0.1.12 | worker-01 | DataNode, NodeManager, ZooKeeper | DataNode, NodeManager, JournalNode, QuorumPeerMain |
| 10.0.1.13 | worker-02 | DataNode, NodeManager, ZooKeeper | DataNode, NodeManager, JournalNode, QuorumPeerMain |
| 10.0.1.14 | worker-03 | DataNode, NodeManager, ZooKeeper | DataNode, NodeManager, JournalNode, QuorumPeerMain |
Funciones de los Demonios
- NameNode (NN): Gestiona el espacio de nombres del sistema de archivos HDFS.
- ResourceManager (RM): Administrador global de recursos para el ecosistema YARN.
- DFSZKFC: Monitoriza el estado del NameNode y ejecuta la conmutación por error automática integrándose con ZooKeeper.
- JournalNode (JN): Mantiene la consistencia de los logs de edición (edits) entre los NameNodes activos y en espera.
- DataNode (DN) y NodeManager (NM): Ejecutan el almacenamiento de bloques y las tareas de procesamiento respectivamente.
- QuorumPeerMain: Proceso central de ZooKeeper para la coordinación distribuida.
Estructura de Directorios
| Variable / Concepto | Ruta en el Sistema |
|---|---|
| HADOOP_BASE | /opt/cdh/hadoop-2.6.0 |
| Almacenamiento de Datos | /data/hadoop/ |
| Registros (Logs) | /var/log/hadoop/ |
Preparación del Entorno Operativo
1. Configuración de Red y Seguridad
En todos los nodos, desactive el firewall del sistema operativo para evitar bloqueos en los puertos RPC internos del clúster. Se asume que la red subyacente ya está aislada.
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
Establezca la resolución de nombres editando el archivo /etc/hosts en las cinco máquinas:
10.0.1.10 master-01
10.0.1.11 master-02
10.0.1.12 worker-01
10.0.1.13 worker-02
10.0.1.14 worker-03
2. Creación de Usuario y Acceso sin Contraseña
Genere un usuario dedicado para la administración del clúster en todos los servidores:
useradd -m hdadmin
passwd hdadmin
Configure la autenticación SSH sin contraseña desde los nodos maestros hacia todos los demás nodos (incluyéndose a sí mismos). Se utilizará un puerto SSH personalizado (2222) para este ejemplo:
su - hdadmin
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
ssh-copy-id -p 2222 hdadmin@master-01
ssh-copy-id -p 2222 hdadmin@master-02
ssh-copy-id -p 2222 hdadmin@worker-01
ssh-copy-id -p 2222 hdadmin@worker-02
ssh-copy-id -p 2222 hdadmin@worker-03
3. Variables de Entorno Globales
Agregue las rutas de los binarios de Hadoop al perfil del usuario hdadmin en todos los nodos (~/.bashrc):
export HADOOP_HOME=/opt/cdh/hadoop-2.6.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
Aplique los cambios ejecutando source ~/.bashrc.
Configuración de Alta Disponibilidad en Hadoop
Los siguientes ajustes se realizan inicialmente en master-01. Una vez validados, el directorio de configuración se distribuirá al resto del clúster.
1. Ajustes de Entorno (hadoop-env.sh y yarn-env.sh)
Defina la ubicación de Java, los directorios de logs y el puerto SSH personalizado en $HADOOP_HOME/etc/hadoop/hadoop-env.sh:
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk"
export HADOOP_LOG_DIR="/var/log/hadoop"
export HADOOP_SSH_OPTS="-p 2222"
En yarn-env.sh, configure el directorio de logs para YARN:
export YARN_LOG_DIR="/var/log/hadoop/yarn"
2. Propiedades del Núcleo (core-site.xml)
Establezca el URI lógico del clúster y los parámetros de retención de la papelera de reciclaje.
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://prod-cluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>10080</value> <!-- 7 días -->
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>worker-01:2181,worker-02:2181,worker-03:2181</value>
</property>
</configuration>
3. Configuración HDFS y HA (hdfs-site.xml)
Defina los identificadores de los NameNodes, las direcciones RPC, los JournalNodes y los mecanismos de aislamiento (fencing).
<configuration>
<property>
<name>dfs.nameservices</name>
<value>prod-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.prod-cluster</name>
<value>nn-primary,nn-standby</value>
</property>
<!-- Direcciones RPC y HTTP para NN -->
<property>
<name>dfs.namenode.rpc-address.prod-cluster.nn-primary</name>
<value>master-01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.prod-cluster.nn-standby</name>
<value>master-02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.prod-cluster.nn-primary</name>
<value>master-01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.prod-cluster.nn-standby</name>
<value>master-02:50070</value>
</property>
<!-- Almacenamiento Local -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/dfs/data</value>
</property>
<!-- JournalNodes para Edits Compartidos -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://worker-01:8485;worker-02:8485;worker-03:8485/prod-cluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/dfs/journal</value>
</property>
<!-- Conmutación por Error Automática -->
<property>
<name>dfs.client.failover.proxy.provider.prod-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- Mecanismo de Fencing -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence(hdadmin:2222)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hdadmin/.ssh/id_rsa</value>
</property>
</configuration>
4. Configuración de YARN (yarn-site.xml)
Habilite la alta disponibilidad para el ResourceManager y defina las interacciones con ZooKeeper.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Alta Disponibilidad de RM -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-prod</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- Direcciones de los RM -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master-01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master-02</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master-01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>master-02:8088</value>
</property>
<!-- Integración con ZooKeeper para State Store -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>worker-01:2181,worker-02:2181,worker-03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
5. Asignación de Recursos MapReduce (mapred-site.xml)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master-01:10020</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
</configuration>
6. Registro de Nodos de Trabajo (slaves)
En el archivo slaves (o workers), liste los hosts que actuarán como DataNodes y NodeManagers:
worker-01
worker-02
worker-03
7. Distribución de la Configuración
Sincronice el directorio de Hadoop con el resto de los nodos utilizando rsync:
rsync -avz -e "ssh -p 2222" /opt/cdh/hadoop-2.6.0/ hdadmin@master-02:/opt/cdh/hadoop-2.6.0/
rsync -avz -e "ssh -p 2222" /opt/cdh/hadoop-2.6.0/ hdadmin@worker-01:/opt/cdh/hadoop-2.6.0/
rsync -avz -e "ssh -p 2222" /opt/cdh/hadoop-2.6.0/ hdadmin@worker-02:/opt/cdh/hadoop-2.6.0/
rsync -avz -e "ssh -p 2222" /opt/cdh/hadoop-2.6.0/ hdadmin@worker-03:/opt/cdh/hadoop-2.6.0/
Inicialización y Despliegue de Servicios
Paso 1: Arranque de los JournalNodes
Ejecute el siguiente comando en cada uno de los nodos worker (worker-01, worker-02, worker-03):
hadoop-daemon.sh start journalnode
Paso 2: Formateo del NameNode Primario
En master-01, inicialice el espacio de nombres:
hdfs namenode -format
Paso 3: Sincronización de Metadatos al NameNode Secundario
Copie el directorio de metadatos recién creado desde master-01 hacia master-02 para asegurar que ambos parten de la misma base:
scp -P 2222 -r /data/hadoop/dfs/name hdadmin@master-02:/data/hadoop/dfs/
Paso 4: Inicialización del Failover Controller en ZooKeeper
En master-01, cree el znode necesario para la gestión de estados:
hdfs zkfc -formatZK
Paso 5: Despliegue del Sistema de Archivos (HDFS)
Desde master-01, inicie todos los demonios de HDFS (NameNodes, DataNodes, JournalNodes y ZKFC):
start-dfs.sh
Verifique los procesos con el comando jps. En los masters debe ver NameNode y DFSZKFailoverController. En los workers, DataNode y JournalNode.
Paso 6: Despliegue de YARN
Inicie el ResourceManager principal y los NodeManagers desde master-01:
start-yarn.sh
Para activar el ResourceManager en espera, inicie sesión en master-02 y ejecute:
yarn-daemon.sh start resourcemanager
Referencia de Operaciones Diarias
Gestión del Clúster HDFS
# Verificar estado de los NameNodes (Activo vs Standby)
hdfs haadmin -getServiceState nn-primary
hdfs haadmin -getServiceState nn-standby
# Forzar transición (útil en mantenimiento)
hdfs haadmin -transitionToStandby nn-primary
hdfs haadmin -transitionToActive nn-standby
# Detener servicios HDFS
stop-dfs.sh
Gestión del Clúster YARN
# Detener servicios YARN desde master-01
stop-yarn.sh
# Detener RM de respaldo desde master-02
yarn-daemon.sh stop resourcemanager
Variables de Entorno Avanzadas para Ecosistema
Si se expande el clúster con herramientas adicionales, centralice sus variables de entorno en /etc/profile.d/bigdata.sh:
# Hive
export HIVE_HOME=/opt/cdh/hive
export PATH=$PATH:$HIVE_HOME/bin
# HBase
export HBASE_HOME=/opt/cdh/hbase
export PATH=$PATH:$HBASE_HOME/bin
# ZooKeeper
export ZK_HOME=/opt/cdh/zookeeper
export PATH=$PATH:$ZK_HOME/bin
# Spark
export SPARK_HOME=/opt/cdh/spark
export PATH=$PATH:$SPARK_HOME/bin