Saltar navegación

Modificación del cluster

Añadir y retirar DataNodes/NodeManagers

Iniciar a partir de la tercera imagen y la tercera plantilla una nueva MV, llamada datanode3

  • Comprobar su IP y añadirla al fichero /etc/hosts de las otras MVs

Creación de ficheros include/exclude

Aunque no es estrictamente necesario para añadir o retirar nodos del cluster, es conveniente tener una lista en la que podamos indicar los nodos que se pueden añadir o retirar del cluster. Para ello, haced lo siguiente en el NameNode (como usuario hdmaster):

  1. Parad los demonios
  2. Crear cuatro ficheros: $HADOOP_PREFIX/etc/hadoop/dfs.include, $HADOOP_PREFIX/etc/hadoop/dfs.exclude, $HADOOP_PREFIX/etc/hadoop/yarn.include$HADOOP_PREFIX/etc/hadoop/yarn.exclude (inicialmente vacíos)
  3. En los fichero dfs.include y yarn.include, poned los nombres de todos los DataNodes/NodeManagers que querramos que estén en el cluster . Dejad los ficheros dfs.exclude y yarn.exclude vacíos.
  4. En el fichero de configuración hdfs-site.xml, añadid dos propiedades:
    • dfs.hosts: nombre de un fichero con lista de hosts que pueden actuar como DataNodes; si el fichero está vacío, cualquier nodo están permitido. Darle como valor, el path al fichero dfs.include
    • dfs.hosts.exclude:  nombre de un fichero con lista de hosts que no pueden actuar como DataNodes; si el fichero está vacío, ninguno está excluido. Darle como valor, el path al fichero dfs.exclude
  5. En el fichero yarn-site.xml, añadid dos propiedades:
    • yarn.resourcemanager.nodes.include-path: nombre de un fichero con lista de hosts que pueden actuar como NodeManagers; si el fichero está vacío, cualquier nodo están permitido. Darle como valor, el path al fichero yarn.include
    • yarn.resourcemanager.nodes.exclude-path: nombre de un fichero con lista de hosts que no pueden actuar como NodeManagers; si el fichero está vacío, ninguno está excluido. Darle como valor, el path al fichero yarn.exclude 
  6. Reiniciad los demonios.

 

Añadir un datanode/nodemanager

Vamos a añadir un nuevo nodo al clusterl:

  1. En el Namenode, añadir el nombre de nuevo nodo (datanode3) en los ficheros dfs-include y yarn-include
  2. Actualizar el NameNode con los nuevos DataNodes ejecutando:
    • hdfs dfsadmin -refreshNodes
  3. Actualizar el JobTracker con los nuevos TaskTrackers ejecutando:
    • yarn rmadmin -refreshNodes
  4. Comprobad en el interfaz web del NameNode, que este nuevo nodo aparece como Dead
  5. Iniciar un nuevo nodo (datanode3) como el resto de nodos del cluster (con lo que tendrá ya Hadoop instalado), y modifica los ficheros /etc/hosts de todos los nodos para incluirlo
  6. Conectarse por ssh al nuevo nodo e iniciar manualmente los demonios del datanode/jobtracker en el nuevo nodo (como usuario hdmaster)
    • $HADOOP_PREFIX/sbin/hadoop-daemon.sh start datanode
    • $HADOOP_PREFIX/sbin/yarn-daemon.sh start nodemanager

El nodo contacta automáticamente con el Namenode y se unirá al cluster

  1. Usa (en el NameNode) los comandos hdfs dfsadmin -report y yarn node -list para combrobar que el nuevo nodo se ha añadido. Puedes comprobarlo también el interfaz web del NameNode y de YARN.

El nuevo nodo, inicialmente está vacío (no tiene datos de HDFS), con lo que el cluster estará desbalanceado. Se puede forzar el balanceo ejecutando, en el NameNode:

  • hdfs balancer

Para más información, ver https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#balancer

Retirar un DataNode

En principio, el apagado de un DataNode no debería afectar al cluster. Sin embargo, si queremos hacer un apagado programado de un DataNode es preferible advertir al NameNode previamente. Para eliminar un DataNode puedes seguir los siguientes pasos:

Pasos:

  1. Poned el nombre del nodo o nodos que queremos retirar en los fichero dfs-exclude y yarn-exclude y ejecutar
    • hdfs dfsadmin -refreshNodes
    • yarn rmadmin -refreshNodes
  2. Comprobad que al cabo de un rato, en el interfaz web o mediante los comandos los comandos hdfs dfsadmin -report y yarn node -list, que el/los nodo(s) excluido(s) aparece(n) que está(n) Decomissioned en HDFS y YARN

ya podríamos parar los demonios en el nodo decomisionado y apagarlo. Si no queremos volver a incluirlo en el cluster:

  1. Eliminar el/los nodo(s) de los ficheros include y exclude y ejecutar otra vez
    • hdfs dfsadmin -refreshNodes
    • yarn rmadmin -refreshNodes
  2. Eliminar el/los nodo(s) del fichero slaves

Rack awareness

Para obtener el máximo rendimiento, es importante configurar Hadoop para para que conozca la topología de nuestra red. Por defecto, Hadoop considera que todos los DataNodes son iguales y están situados en un único rack, que identifica como /default-rack.

Para clusters multirack, debemos indicar a Hadoop en que rack está cada nodo, para mejorar la eficiencia y la fiabilidad.

Arquitectura típica en 2 niveles de un cluster Hadoop

En la imagen, se muestra una arquitectura típica en 2 niveles de un cluster Hadoop. Esta topología puede describirse en forma de árbol, como /switch1/rack1 y /switch1/rack2, o, simplificando /rack1 y /rack2. Para indicarle esta topología a Hadoop, es necesario utilizar un script que mapee los nombres de los nodos al rack en el que se encuentran.

En nuestro caso, vamos a suponer que tenemos 2 racks (rack1 y rack2) y que tenemos un nodos en cada rack. Haced lo siguiente en el NameNode como usuario hdmaster:

  1. Apagar los demonios.
  2. Crear un fichero $HADOOP_PREFIX/etc/hadoop/topology.data que tenga en cada linea la IP de uno de los DataNodes y el rack donde está, como en este ejemplo (cambiando las IPs por las tuyas)
    10.38.3.xx    /rack1
    10.38.3.xx /rack2 10.38.3.xx /rack2
  3. Crear un script de bash $HADOOP_PREFIX/etc/hadoop/topology.script como el siguiente (fuente: http://wiki.apache.org/hadoop/topology_rack_awareness_scripts). Darle permisos de ejecución (chmod +x topology.script).
    #!/bin/bash
    
    HADOOP_CONF=/opt/bd/hadoop/etc/hadoop 
    while [ $# -gt 0 ] ; do
      nodeArg=$1
      exec< ${HADOOP_CONF}/topology.data 
      result="" 
      while read line ; do
        ar=( $line ) 
        if [ "${ar[0]}" = "$nodeArg" ] ; then
          result="${ar[1]}"
        fi
      done
      shift 
      if [ -z "$result" ] ; then
        echo -n "/default-rack "
      else
        echo -n "$result "
      fi
    done
  4. Define en el fichero core-site.xml la propiedad net.topology.script.file.name y darle como valor el path completo al script
  5. Inicia los demonios y comproba que se han identificado los racks ejecutando hdfs dfsadmin -printTopology

Licenciado baixo a GNU Free Documentation License (Versión local)