SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 16 de julio de 2009

Instalación de Hadoop sobre Solaris 10 - Configuración

Introducción
Ya hemos visto en el post anterior como Instalar Hadoop sobre Solaris 10, sin embargo, no hemos hecho más que empezar. En esta nueva entrega configuraremos Hadoop y Solaris para tener un Cluster funcional con soporte para HDFS.

Debemos tener en cuenta que la seguridad de HDFS no es más elevada que la que nos pueda proporcionar NFS, por lo tanto, es altamente recomendable que las máquinas que componen el cluster de Hadoop sólo se dediquen a esto y que los usuarios no puedan hacer login en las mismas.

Por ejemplo, podemos estructurar nuestra red utilizando el siguiente esquema:

Nota: La configuración del esquema es conceptual ya que las reglas del firewall deben ser más extensas, sin embargo, quería mostrar el concepto de bloquear todo el acceso al cluster de Hadoop desde cualquier workstation exceptuando una encargada de su gestión.

Desactivación de servicios no necesarios en Solaris 10
Aunque este paso no es estrictamente necesario, es muy recomendable ya que queremos realizar una instalación lo más óptima posible con el fin de poder utilizar Hadoop en producción.
# svcadm disable svc:/application/graphical-login/cde-login:default
# svcadm disable svc:/network/smtp:sendmail

Configuración de Hadoop - HDFS

Vamos a comenzar configurando el sistema HDFS, para ello, debemos tener en cuenta que en esta arquitectura el namenode es nuestro punto único de fallo (SPOF) y por lo tanto los metadatos y log de transacciones son nuestro mayor tesoro, son como los Redolog y ArchiveLog de Oracle, por ello, vamos a utilizar la arquitectura OFA pero un poco adaptada.

En Oracle utilizaríamos una SAN para almacenar los datos, sin embargo, una de las principales caracteristicas de HDFS es que utiliza una arquitectura shared_nothing, es decir, cada nodo almacena su información independientemente de los demás. Esta arquitectura nos permite que el fallo de una datanode no afecte a los demás.

Voy a tratar de explicarlo con un ejemplo. Pensemos en HSFS como un RAID 5, donde cada disco del RAID es un datanode y por lo tanto ante la pérdida de un disco, los demás reconstruyen el contenido. Bien, HDFS copia cada bloque de datos n veces, siendo 3 por defecto, por lo tanto, es aquí donde encontramos la redundancia. Creo que el funcionamiento de HDFS y su tuning me llevará todo un post que lo verás dentro de poco, hasta entonces puedes encontrar más información en Apache HDFS.

Como ya he comentado nuestro namenode es nuestro SPOF por lo tanto, debemos tener la mayor redundancia posible en este host, es decir, RAID 1 o RAID 1+0 para el almacenamiento de los metadatos y transaction logs que serán las partes necesarias para poder reconstruir el sistema de ficheros ante una caída.

Nota: En mi instalación de ejemplo no existe RAID, ni HDD separados, aunque sea para pruebas no es muy recomendable esta configuración.

Por lo tanto, vamos a utilizar el path /u02/metadata/${user.name} para el almacenamiento de los metadatos, /u02/editlog/${user.name} para transaction log (EditLog) y /u02/data/${user.name} para los bloques de datos, de esta forma, podemos tener varias instalaciones de Hadoop ejecutándose con diferentes nombres, con un único path de almacenamiento ya que Hadoop convertirá ${user.name} al nombre de usuario que está ejecutando Hadoop.

# mkdir -p /u02/metadata/hadoop
# mkdir -p /u02/editlog/hadoop
# mkdir -p /u02/data/hadoop
# mkdir -p /u02/pid/hadoop
# chown -R hadoop:hadoop /u02/
# chmod 700 /u02

Nota: Como siempre, deberemos crear la estructura de directorios en todos los nodos del cluster.


Ya estamos listos para comenzar con la configuración de Hadoop, nos conectaremos a la máquina que va hacer de namenode y establecemos la configuración que luego replicaremos en todos los nodos. La configuración mínima que debemos establecer es:
  • JAVA_HOME path de java, en nuestro caso, /usr/java
  • HADOOP_HEAPSIZE tamaño máximo en Mb de JavaHeap, en nuestro caso, 500
  • HADOOP_OPTS opciones de tuning para la máquina virtual, en nuestro caso, -server
  • HADOOP_MASTER configuración de la cual se sincronizarán los clientes, en nuestro caso, master:$HADOOP_HOME/src/hadoop
  • HADOOP_PID_DIR ubicación de los pid, en Solaris es, /var/run
Así que nos conectamos al NameNode y configuramos el sistema de la siguiente forma
# zonename
global
# su - hadoop
$ cd $HADOOP_HOME
$ vi conf/hadoop-env.sh
export JAVA_HOME=/usr/java
export HADOOP_HEAPSIZE=500
export HADOOP_OPTS=-server
export HADOOP_PID_DIR=/u02/pid/hadoop

# Command specific options appended to HADOOP_OPTS when specified
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
En el archivo $HADOOP_HOME/conf/core-site.xml

<property>
<name>fs.default.name</name>
<value>hdfs://namenode.hadoop.test.com:54310/</value>
<final>true</final>
</property>

<property>
<name>mapred.job.tracker</name>
<value>hdfs://namenode.hadoop.test.com:54311/</value>
<final>true</final>
</property>
Nota: El valor debe ser hdfs://___nombre_dns__que__queramos__/

Ahora vamos a editar el archivo de configuración de HDFS que se encuentra en $HADOOP_HOME/conf/hdfs-site.xml sin embargo hay que tener en cuenta unas cosas. En nuestra configuración queremos hacer distinción de metadata, editlog y data, por ello vamos a definir las propiedades dfs.name.dir (MetaDatos), dfs.name.edits.dir (EditLog) y dfs.data.dir, si no queremos separarlo podemos dejarlo con sus configuraciones por defecto, para ello sólo debemos establacer el la propiedad hadoop.tmp.dir. Puedes ver la configuración por defecto que se aplicará a HDFS en $HADOOP_HOME/src/hdfs/hdfs-default.xml

  • dfs.name.dir ubicación de los metadatos, en nuestro caso, /u02/metadata/${user.name}
  • dfs.name.edits.dir ubicación de los editlog, en nuestro caso, /u02/editlog/${user.name}
  • dfs.data.dir ubicación de los bloques de datos, en nuestro caso, /u02/data/${user.name}
  • dfs.replication número de réplicas, en nuestro caso, 8
El formato del archivo es xml utilizando los tags property, name y value para asignarlos. Existe una etiqueta llamada final que si está establecida a true el valor de la propiedad no puede ser modificado en ejecución. A continuación se muestra el archivo $HADOOP_HOME/conf/hdfs-site.xml

<property>
<name>dfs.name.dir</name>
<value>/u02/metadata/${user.name}</value>
<final>true</final>
</property><property>
<name>dfs.name.edits.dir</name>
<value>/u02/editlog/${user.name}</value>
<final>true</final>
</property>
<property>
<name>dfs.data.dir</name>
<value>/u02/data/${user.name}</value>
<final>true</final>
</property>
<property>
<name>dfs.replication</name>
<value>8</value>
</property>
Asignaremos ahora los master y slaves, como hemos comentado con anterioridad, HDFS necesita de un NameNode y JobTracker como mínimo y de mútiples datanodes. Así que en el fichero masters pondremos el NameNode y TrackerNode y en el fichero slaves todos los datanode que queramos, en nuestro caso node1 y node2.

Nota: Esto no lo tengo todavía muy claro, ya que no encuentro ninguna información sobre "TrackerNode" así que he asumido que irá en Masters, ya que son los dos únicos que hacen de Master

$ echo "namenode" > $HADOOP_HOME/conf/masters
$ echo "node1" > $HADOOP_HOME/conf/slaves
$ echo "node2" >> $HADOOP_HOME/conf/slaves
Ya hemos configurado el nodo principal, ahora tenemos que replicar la configuración a los nodos secundarios node1 y node2

$ pwd
/opt/hadoop/conf
$ scp hadoop-env.sh core-site.xml hdfs-site.xml masters hadoop@node1:$PWD
hadoop-env.sh 100% |**********************************************************************************************************| 2222 00:00
core-site.xml 100% |**********************************************************************************************************| 433 00:00
hdfs-site.xml 100% |**********************************************************************************************************| 599 00:00
masters 100% |**********************************************************************************************************| 9 00:00

$ scp hadoop-env.sh core-site.xml hdfs-site.xml masters hadoop@node2:$PWD
hadoop-env.sh 100% |**********************************************************************************************************| 2222 00:00
core-site.xml 100% |**********************************************************************************************************| 433 00:00
hdfs-site.xml 100% |**********************************************************************************************************| 599 00:00
masters 100% |**********************************************************************************************************| 9 00:00

Y eliminamos el contenido del archivo slaves en los nodos node1 y node2 ya que no tienen ninguno.

$ ssh node1
$ echo "" > $HADOOP_HOME/conf/slaves

$ ssh node2
$ echo "" > $HADOOP_HOME/conf/slaves

Con esto, hemos acabado la configuración de Hadoop!! Ahora, el siguiente paso es formatear la nueva unidad HDFS para que podamos empezar a trabajar con ella.

$ bin/hadoop namenode -format
09/07/17 10:37:00 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = sol10-enigma/10.1.1.4
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.0
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.20 -r 763504; compiled by 'ndaley' on Thu Apr 9 05:18:40 UTC 2009
************************************************************/
Re-format filesystem in /u02/metadata/hadoop ? (Y or N) Y
09/07/17 10:37:03 INFO namenode.FSNamesystem: fsOwner=DrWho,hadoop
09/07/17 10:37:03 INFO namenode.FSNamesystem: supergroup=supergroup
09/07/17 10:37:03 INFO namenode.FSNamesystem: isPermissionEnabled=true
09/07/17 10:37:03 INFO common.Storage: Image file of size 95 saved in 0 seconds.
09/07/17 10:37:03 INFO common.Storage: Storage directory /u02/metadata/hadoop has been successfully formatted.
09/07/17 10:37:03 INFO common.Storage: Storage directory /u02/editlog/hadoop has been successfully formatted.
09/07/17 10:37:03 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at sol10-enigma/10.1.1.4
************************************************************/

Una vez formateado en nuevo sistema de ficheros, ya podemos iniciar Hadoop, para ello, debemos iniciar HDFS y MAP

$ $HADOOP_HOME/bin/start-dfs.sh
starting namenode, logging to /opt/hadoop/bin/../logs/hadoop--namenode-sol10-enigma.out
node1: starting datanode, logging to /opt/hadoop/bin/../logs/hadoop-hadoop-datanode-node1.out
node2: starting datanode, logging to /opt/hadoop/bin/../logs/hadoop-hadoop-datanode-node2.out
namenode: starting secondarynamenode, logging to /opt/hadoop/bin/../logs/hadoop-hadoop-secondarynamenode-sol10-enigma.out

$ $HADOOP_HOME/bin/start-mapred.sh
starting jobtracker, logging to /opt/hadoop/bin/../logs/hadoop--jobtracker-sol10-enigma.out
node1: starting tasktracker, logging to /opt/hadoop/bin/../logs/hadoop-hadoop-tasktracker-node1.out
node2: starting tasktracker, logging to /opt/hadoop/bin/../logs/hadoop-hadoop-tasktracker-node2.out

Si todo ha ido bien, podemos ver que el sistema está funcionando utilizando el comando jps del JDK que nos proporciona el pid y ClassName

$ /usr/java/bin/jps
8619 Jps
8473 JobTracker
2998 SecondaryNameNode
2826 NameNode


Un poco de resumen

Hemos visto como configurar el sistema de ficheros HDFS utilizando diferentes path para los metadatos, editlog y data, de esta forma, podemos separar en diferentes unidades físicas cada una de las partes, añadiendo tolerancia a fallos incorporando algún sistema de RAID en metadata y editlog.

En el próximo post empezaremos con nuestro HelloWorld dentro de HDFS y los comandos más básicos, espero no haberos aburrido mucho :)

No hay comentarios:

Publicar un comentario en la entrada