Este guía detalla la configuración de un clúster Hadoop 2.7.1 en modo totalmente distribuido en CentOS, utilizando tres nodos para lograr alta disponibilidad en HDFS y YARN.
Requisitos previos
- Tres máquinas virtuales o físicas con CentOS instalado.
- Paquete de Hadoop 2.7.1 descargado (por ejemplo,
hadoop-2.7.1-64bit.tar.gz). - Acceso root a todos los nodos.
Paso 1: Desactivar el firewall en todos los nodos
# Detener firewall temporalmente
systemctl stop firewalld
# Desactivar firewall permanentemente
systemctl disable firewalld
Paso 2: Configurar nombres de host
Editar el archivo /etc/hostname en cada nodo para asignar nombres únicos, como nodo-maestro1, nodo-maestro2, nodo-esclavo1.
hostnamectl set-hostname nodo-maestro1 # Ejemplo en el primer nodo
Paso 3: Mapear direcciones IP a nombres de host
En el archivo /etc/hosts de cada nodo, agregar líneas como:
192.168.1.101 nodo-maestro1
192.168.1.102 nodo-maestro2
192.168.1.103 nodo-esclavo1
Asegúrese de que el contenido sea idéntico en todos los nodos.
Paso 4: Reiniciar los nodos
reboot
Paso 5: Configurar acceso SSH sin contraseña entre nodos
Generar claves SSH en cada nodo y copiarlas a los demás:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id root@nodo-maestro1
ssh-copy-id root@nodo-maestro2
ssh-copy-id root@nodo-esclavo1
Verificar el acceso: desde cualquier nodo, ejecutar ssh nodo-maestro1 sin contraseña.
Paso 6: Descomprimir e instalar Hadoop
tar -xzvf hadoop-2.7.1-64bit.tar.gz -C /opt/
mv /opt/hadoop-2.7.1 /opt/hadoop-cluster
Paso 7: Configurar variables de entorno para Hadoop
Editar el archivo /opt/hadoop-cluster/etc/hadoop/hadoop-env.sh:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export HADOOP_CONF_DIR=/opt/hadoop-cluster/etc/hadoop
Luego, aplicar los cambios con source hadoop-env.sh.
Paso 8: Configurar el archivo core-site.xml
En /opt/hadoop-cluster/etc/hadoop/core-site.xml, agregar:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mi-cluster-hdfs</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-cluster/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>nodo-maestro1:2181,nodo-maestro2:2181,nodo-esclavo1:2181</value>
</property>
</configuration>
Paso 9: Configurar el archivo hdfs-site.xml
En /opt/hadoop-cluster/etc/hadoop/hdfs-site.xml, definir la alta disponibilidad:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mi-cluster-hdfs</value>
</property>
<property>
<name>dfs.ha.namenodes.mi-cluster-hdfs</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mi-cluster-hdfs.nn1</name>
<value>nodo-maestro1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mi-cluster-hdfs.nn1</name>
<value>nodo-maestro1:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mi-cluster-hdfs.nn2</name>
<value>nodo-maestro2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mi-cluster-hdfs.nn2</name>
<value>nodo-maestro2:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nodo-maestro1:8485;nodo-maestro2:8485;nodo-esclavo1:8485/mi-cluster-hdfs</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop-cluster/tmp/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mi-cluster-hdfs</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop-cluster/tmp/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop-cluster/tmp/hdfs/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
Paso 10: Configurar mapred-site.xml y yarn-site.xml
Copiar y editar los archivos de configuración:
# Para mapred-site.xml
cp /opt/hadoop-cluster/etc/hadoop/mapred-site.xml.template /opt/hadoop-cluster/etc/hadoop/mapred-site.xml
# Editar mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
En yarn-site.xml:
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>nodo-maestro1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>nodo-maestro2</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>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>nodo-maestro1:2181,nodo-maestro2:2181,nodo-esclavo1:2181</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mi-cluster-yarn</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nodo-maestro1</value>
</property>
</configuration>
Paso 11: Definir los nodos esclavos
Editar el archivo /opt/hadoop-cluster/etc/hadoop/slaves:
nodo-maestro1
nodo-maestro2
nodo-esclavo1
Paso 12: Distribuir la configuración a todos los nodos
Copiar el directorio de Hadoop a los otros nodos:
scp -r /opt/hadoop-cluster root@nodo-maestro2:/opt/
scp -r /opt/hadoop-cluster root@nodo-esclavo1:/opt/
Paso 13: Configurar variables de entorno globales
En cada nodo, editar /etc/profile.d/hadoop.sh:
export HADOOP_HOME=/opt/hadoop-cluster
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
Aplicar con source /etc/profile.d/hadoop.sh.
Paso 14: Iniciar ZooKeeper y formatear el clúster
Si ZooKeeper ya está instalado y configurado, iniciar en cada nodo:
# Ejemplo con ZooKeeper en /opt/zookeeper
/opt/zookeeper/bin/zkServer.sh start
/opt/zookeeper/bin/zkServer.sh status
Formatear ZooKeeper para HDFS HA:
hdfs zkfc -formatZK
Paso 15: Iniciar los servicios de Hadoop
En cada nodo, iniciar los JournalNodes:
hadoop-daemon.sh start journalnode
Formatear el NameNode primario:
hdfs namenode -format
Iniciar NameNodes, DataNodes y otros servicios:
# En nodo-maestro1
hadoop-daemon.sh start namenode
# En nodo-maestro2
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
# En todos los nodos
hadoop-daemon.sh start datanode
# En nodos maestros
hadoop-daemon.sh start zkfc
# Iniciar YARN
start-yarn.sh
# En nodo-maestro1
yarn-daemon.sh start resourcemanager
Para iniciar todos los servicios de una vez en clústeres existentes, usar start-dfs.sh y start-yarn.sh.
Verificación
En cada nodo, ejecutar jps para confiramr los procesos activos. Los resultados deben mostrar NameNode, DataNode, JournalNode, ResourceManager, NodeManager, entre otros, según el rol del nodo.