Hadoop Logo

En los post anteriores instalamos Hadoop en un nodo, tanto en modo standalone como pseudo-distribuido, y en un cluster de dos nodos, ahora revisaremos la creación de una aplicación MapReduce.

Hadoop Logo

Para estas pruebas configuraremos un ambiente de desarrollo usando una instalación en modo pseudo-distribuida, eclipse y el plugin de Hadoop para éste IDE. También se puede usar la maquina virtual de entrenamiento proveída por Cloudera, que incluye una instalación de Hadoop, ejemplos, eclipse, entre otras herramientas. Para ejecutar ésta máquina virtual se puede usar VMWare Player. Una vez descargada la imagen de la maquina virtual se descomprime, se abre el archivo .vmx con VMPlayer.

Configuración del entorno de desarrollo

Para nuestro ambiente de desarrollo iniciamos con una máquina con Hadoop configurado en modo pseudo-distribuido, descargamos e instalamos eclipse, y procedemos con la instalación del plugin de Hadoop:

  1. Establecer las variables de entorno JAVA_HOME y HADOOP_HOME, con la ruta a la carpeta raiz de Java y Hadoop respectivamente.
  2. Copiar el plugin de hadoop a la carpeta de plugins de eclipse.
    cp $HADOOP_HOME/contrib/eclipse-plugin/hadoop-0.20.2-eclipse-plugin.jar PATH_TO/eclipse/plugins/
  3. Iniciamos Eclipse.
  4. Abrimos la perspectiva Map/Reduce. Window->Open Perspective->Others->Map/Reduce
  5. Entramos en la vista MapReduce Locations.
  6. Clic derecho sobre la lista MapReduce Locations, seleccionar New Hadoop location.
  7. Le damos un nombre a la nueva ubicación, y configuramos el host y puerto tanto del MapReduce master(JobTracker) cómo del dfs.master (NameNode).
  8. Ahora en el explorador de proyectos podremos ver los archivos de nuestro sistema de archivos distribuido en DFS Locations.

Ahora tenemos listo nuestro ambiente de desarrollo, a continuación crearemos una aplicación MapReduce.

Crear una nueva aplicación

El plugin de Hadoop nos crea un nuevo tipo de proyecto en eclipse y tres tipos de archivo Mapper, Reducer y MapReduce Driver. Para crear nuestra nueva aplicación crearemos un proyecto MapReduce:

Continuar leyendo

En un post anterior realizamos la instalación de hadoop en un nodo, tanto en modo standalone como pseudo-distribuido. Ahora realizaremos la instalación en dos nodos.

Hadoop Logo

Un par de cosas a tener en cuenta:

  • De acuerdo a la documentación, típicamente se tiene un nodo como NameNode y otro como JobTracker. Los demás nodos serán configurados como DataNode y TaskTracker.
  • Aunque no es obligatorio, es recomendable que los nodos tengan el mismo HADOOP_HOME, directorio raíz de la distribución.

Lo primero por hacer es descargar Hadoop, descomprimirlo en lo que será nuestro HADOOP_HOME, y configurar el JAVA_HOME dentro de conf/hadoop-env.sh.

wget http://apache.mirrors.tds.net//hadoop/core/stable/hadoop-0.20.2.tar.gz
tar -xvf hadoop-0.20.2.tar.gz
vim hadoop-0.20.2/conf/hadoop-env.sh

Para distribuir un poco la carga configuraremos el NameNode en una máquina y el JobTracker en otra. También configuraremos los dos nodos como TaskTracker y DataNode.

Para ello debemos modificar el archivo de configuración conf/core-site.xml con la url del que será el NameNode.

<configuration>

<property>

<name>fs.default.name</name>

<value>hdfs://namenode:9000</value>

</property>

</configuration>

Para especificarle a Hadoop en donde almacenar los bloques de datos del DFS se puede usar la propiedad dfs.data.dir y como valor la ruta del directorio, en el archivo conf/hdfs-site.xml. En éste archivo es necesario configurar la replicación de los bloques, el valor predeterminado es 3, en éste caso solo tenemos dos nodos así que utilizaremos un valor de dfs.replication de 2.

<configuration>
<property>
<name>dfs.data.dir</name>
<value>/data/hadoopdd</value>
</property>
<property>

<name>dfs.name.dir</name>

<value>/data/hadoopnd</value>

</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>

Debemos especificar la ubicación del JobTracker, lo hacemos en el archivo de configuración mapred-site.xml. En este archivo también configuramos donde se almacenarán los archivos temporales.

<configuration>

<property>

<name>mapred.job.tracker</name>

<value>157.253.236.228:54311</value>

</property>

<property>

<name>mapred.local.dir</name>

<value>/data/hadoopmr</value>

</property>

</configuration>

Debemos asegurarnos que podemos iniciar sesión ssh sin contraseña en las dos máquinas, para ello seguimos los pasos indicados para la instalación en un solo nodo y, además, agregar las llaves públicas ssh de las máquinas master en el archivo .ssh/authorized_keys máquinas slave:

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

$ ssh-copy-id -i .ssh/id_dsa.pub {ip_slave}

Los siguientes archivos solo se deben editar en los master(en este caso en los dos nodos, pero al agregar un nuevo nodo solo se modifican en los NameNode y JobTracker).

En el archivo conf/masters se listan los nodos master, tanto NodeName como JobTracker, en el archivo conf/slaves todos los nodos DataNode y TaskTracker, uno por línea.

Formateamos el sistema de archivos distribuido, ejecutando en el NameNode:

./hadoop-0.20.2/bin/hadoop namenode -format

Arrancamos los demonios de hdfs, ejecutando

bin/start-dfs.sh

Podemos los procesos ejecutados en cáda maquina usando el comando jps.

A continuación iniciamos los demonios de Mapreduce, ejecutando en el JobTracker:

bin/start-mapred.sh

Para detener los demonios del sistema de archivos y de mapreduce, respectivamente, ejecutamos:

bin/stop-dfs.sh
bin/stop-mapred.sh

Ahora deberíamos poder correr el ejemplo que utilizamos en la instalación anterior:

$ bin/hadoop fs -put conf input

$ bin/hadoop jar hadoop-*-examples.jar grep input/conf output 'dfs[a-z.]+'

Sin embargo se pueden presentar algunos problemas en el dfs, por un bug que aún se encuentra abierto. En http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_(Multi-Node_Cluster) podemos ver otro tutorial(en ingles) de la instalación del cluster, con una configuración un poco diferente, y las alternativas para resolver los problemas que se pueden presentar.

En un próximo artículo revisaremos el desarrollo de una aplicación MapReduce para Hadoop.