Despliegue de un Clúster Hadoop CDH5 con Alta Disponibilidad

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

Etiquetas: Hadoop HDFS YARN Zookeeper CDH

Publicado el 6-9 18:08