Instalando Hadoop 1.2.1 con librerías nativas

Guía para compilar e instalar Hadoop 1.2.1 con librerías nativas a partir del código fuente.

Hadoop

Obtener el código fuente de Hadoop 1.2.1:

Dependencias

En ubuntu 13.04:

Activar la compilación de Snappy, cambiando en build.xml:

por

y

por

(dependiente de la distribución, comprobar mediante $ dpkg -L libsnappy-dev)
Añadir a la línea 1584 (variables de entorno de ejecución del script de empaquetado):

Modificar el fichero src/native/packageNativeHadoop.sh para que empaquete bien la librería Snappy, sustituyendo la línea 71:

por

Compilar

El resultado se encuentra en build/hadoop-1.2.1-...-bin.tar.gz con un distribuible “de producción”.

Binario con código fuente

Personalmente utilizo el .tar.gz con fuentes porque así tengo un acceso más fácil a la configuración por defecto (core-default.xml, hdfs-default.xml y mapred-default.xml), así que el resto del artículo es en base a ello.

Si se desea realizar la compilación que incluye el código fuente, primero hay que sustituir en build.xml porque hay que intallar previamente Forrest y no tengo ganas:

por

y compilar:

Esto generará 2 ficheros:

  • build/hadoop-1.2.1.tar.gz: fuentes, ejecutables y librerías.
  • build/hadoop-1.2.1-bin.tar.gz: sólo ejecutables y librerías.

Configurar

Descomprimir hadoop-1.2.1.tar.gz.
Modificar /etc/hosts añadiendo la IP externa del nodo (y eliminando la referencia que suele aparecer en Ubuntu con IP 127.0.1.1).
Configurar en hadoop-1.2.1/conf/ los ficheros core-site, hdfs-site y mapred-site (se ponen aquí unos como ejemplo). Modificar el nombre del nodo master (en donde corresponda), y el nombre de usuario en mapred-site.xml.
Modificar /etc/environment: agregar a $PATH la ruta /home/hadoop/hadoop-1.2.1/bin y la entrada JAVA_HOME=...

Yo suelo usar unos scripts para borrar todo HDFS y para lanzar y apagar cada nodo: clear-all, start-all, stop-all.

Hadoop not running the datanode (issue 1)

Found this in datanode’s log file? :

This means you have configured your datanode’s dfs.datanode.failed.volumes.tolerated to 1 (or more) in hdfs-site.xml. Delete that configuration option and done.

Clúster de Hadoop 2.0.1-alpha + HBase 0.94.2-rc3

Configuración inicial

 
Crear el usuario cluster en todos los nodos, y con directorio home /home/cluster/.
Crearemos un nodo master00 que contendrá el ResourceMangager, NameNode y JobHistory Server (podrían estar los tres en nodos diferentes). En un nodo a parte podríamos poner el SecondaryNameNode.

Crearemos nodos esclavos slave01, slave02, slave03,… cada uno con un NodeManager y un DataNode.

Crear el script ~/set_paths para configurar todas las variables de entorno necesarias con el contenido:

export HADOOP_PREFIX=/home/cluster/hadoop
export YARN_HOME=/home/cluster/hadoop
export PATH=/home/cluster/hbase/bin:$PATH
export JAVA_HOME=<code>update-java-alternatives -l | grep 1.6 | tail -1 | cut -f3 -d' '</code>

Hadoop

 
La arquitectura de Hadoop 2.0.1 se compone de: un ResourceManager, un NameNode, un MapReduce JobHistory Server, un SecondaryNameNode (no usaré), varios NodeManagers, varios DataNodes, varios WebAppProxy (no usaré).

Descargar la versión Hadoop 2.0.1-alpha y descomprimirla en ~/hadoop.

Configurar ~/hadoop/etc/hadoop/core-site.xml:

Configurar ~/hadoop/etc/hadoop/hdfs-site.xml para NameNode y los DataNodes:

Configurar ~/hadoop/etc/hadoop/yarn-site.xml para ResourceManager y los NodeManagers:

Copiar ~/hadoop/share/hadoop/common/templates/conf/mapred-site.xml a ~/hadoop/etc/hadoop y configurar ~/hadoop/etc/hadoop/mapred-site.xml para los trabajos (Jobs) MapReduce:

Configurar ~/hadoop/etc/hadoop/httpfs-site.xml :

 

HBase

 
Para trabajar con HBase, ejecutaremos en el nodo master00 lo siguiente: HBase Master y ZooKeeper (único del quorum).
En cada nodo slave ejecutaremos una instancia RegionServer.
Exportar del repositorio la versión hbase-0.94.2-rc3 en /home/cluster/hbase-0.94.2-rc3.

Modificamos las dependencias de maven para que compile para Hadoop 2.0.1 al especificar el perfil “2.0”. Para ello, editamos el fichero ~/hbase-0.94.2-rc3/pom.xml, y cambiamos la línea que dice:

por:

Recompilar HBase para Hadoop 2.0:

Descomprimir el paquete creado ~/hbase-0.94.2-rc3/target/hbase-0.94.2.tar.gz en ~/hbase:

Modificamos el fichero ~/hbase/conf/regionservers para que esté vacío:

Modificar ~/hbase/conf/hbase-env.sh y descomentar la línea que dice:

Configurar ~/hbase/conf/hbase-site.xml :

   

Scripts de start/stop del nodo master

 
Una vez configurado todo, creamos el script ~/start-master-all.sh con el contenido:

El script ~/stop-master-all.sh con el contenido:

Scripts de start/stop de los nodos slaves

 
Creamos el script ~/start-slave-all.sh con el contenido:

El script ~/stop-slave-all.sh con el contenido:

 

Interfaces de usuario

 
Después de configurar todo lo anterior y ejecutar el nodo master mediante:

y en el caso de desear esclavos, ejecutar (opcionalmente en el propio master) lo siguiente en cada esclavo:

Se dispondrán de interfaces de usuario web en las siguientes direcciones:

 

Links

 
Referencia de puertos por defecto para Cloudera.
 

Bugs

 

Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.; Host Details : local host is: “master00/192.168.0.6”; destination host is: “master00”:50070;

 
En a página http://master00:50070/dfsnodelist.jsp?whatNodes=LIVE hay enlaces a los Datanodes vivos. Al pinchar alguno de ellos se muestra el error anterior. Esto es debido a un bug en el que se indica erróneamente cuál es la dirección al IPC del Namenode: nnaddr=. Se puede navegar sustituyendo el puerto 50070 por el puerto IPC de Hadoop 8020, de manera que la dirección:

http://master00:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=%2F&nnaddr=192.168.0.6:50070

se sustituye por:

http://master00:50075/browseDirectory.jsp?namenodeInfoPort=50070&dir=%2F&nnaddr=192.168.0.6:8020