Instalando Hadoop 2.7 en un sistema Ubuntu

This post is also available in: English

Este es mi primer post escrito para este sitio. Y elegì hablar de una herramienta o framework que me viene interesando desde un tiempo atrás relacionado con Inteligencia de Negocios y Minería de datos: Hadoop. Voy a hablar entonces de como instalar este framework en nuestro sistema Ubuntu.

Prerequisitos

Como hadoop es un framework desarrollado en java, necesitamos tener instalado java en nuestro sistema. tiene que ser una version 6 o superior. Es simple chequear si tenemos instalado java en nuestros sistemas

javac

$ java -version

Si al correr cualquiera de los dos comandos nos da un error de que no los encuentra, te pido que mires mi video de como instalar el jdk 1.8. en el cuál explico paso a paso como instalarlo

Una vez que esta instalado java, es recomendable exportar las siguientes variables

vim ~/.bashrc

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45

export PATH=$JAVA_HOME/bin:${PATH}

Hecho esto ahora pruebo echo $JAVA_HOME  y me tendría que mostrar en la consola /usr/lib/jvm/jdk1.8.0_45

Ahora si estamos en condiciones de instalar hadoop. Voy a descargarlo de

http://hadoop.apache.org/common/releases.html. Al momento de preparar este material, la versión 2.7 es la última

Lo que vamos a hacer a continuacion es copiar nuestro archivo .tar en /usr/local

sudo cp hadoop-2.7.0.tar.gz /usr/local/

Posiblemente nos pida permiso de super usuario para poder copiar el archivo en esta carpeta, es por ello que se usa sudo.

Ahora vamos a descomprimir el archivo
sudo tar -xvf hadoop-2.7.0.tar.gz

Creamos ahora el enlace simbolico al directorio de instalacion de hadoop

sudo ln -s /usr/local/hadoop-2.7.0 /opt/hadoop

El próximo paso es crear y configurar las keys de ssh. Esto es porque hadoop utiliza ssh para acceder en forma segura a sus nodos lo cual normalmente requiere que el usuario ingrese contraseña.

Lo que voy a hacer es crear una key ssh sin contraseña, solo para fines de este tutorial. Tengo que aclarar que este es una forma insegura de hacerlo y sólo lo hago a los fines de este tutorial

ssh-keygen -t rsa -P ”

Cuando nos pida que ingresemos el nombre del archivo le damos <Enter>.

Ahora tenemos que agregar la llave generada a la lista de llaves autorizadas

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Queda ahora configurar hadoop. Para esto vamos a tener que editar unos cuantos archivos

~/.bashrc

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

/usr/local/hadoop/etc/hadoop/core-site.xml

/usr/local/hadoop/etc/hadoop/yarn-site.xml

/usr/local/hadoop/etc/hadoop/mapred-site.xml.template

/usr/local/hadoop/etc/hadoop/hdfs-site.xml

El primero de ellos es .bashrc

#HADOOP VARIABLES START

export HADOOP_INSTALL=/usr/local/hadoop-2.7.0

export PATH=$PATH:$HADOOP_INSTALL/bin

export PATH=$PATH:$HADOOP_INSTALL/sbin

export HADOOP_MAPRED_HOME=$HADOOP_INSTALL

export HADOOP_COMMON_HOME=$HADOOP_INSTALL

export HADOOP_HDFS_HOME=$HADOOP_INSTALL

export YARN_HOME=$HADOOP_INSTALL

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native

export HADOOP_OPTS=”-Djava.library.path=$HADOOP_INSTALL/lib”

#HADOOP VARIABLES END

A fin de que se carguen los cambios que hicimos en el .bashrc, ejecutare

source ~/.bashrc

El segundo archivo a editar es hadoop-env.sh en el cual se setean las variables de ambiente que correra hadoop. nos aseguramos que se encuentra la línea

export JAVA_HOME=${JAVA_HOME}

El tercer archivo core-site.xml contiene las propiedades de configuración que hadoop habilita al iniciar.

Buscamos el tag <configuration></configuration> e insertamos la siguiente propiedad.

 

<property>

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

<value>hdfs://localhost:9000</value>

</property>

El cuarto archivo es yarn-site.xml el cual contiene las propiedades de configuracion que mapreduce utilizara al iniciar. Otra vez buscamos el tag <configuration></configuration> y le insertamos las siguientes propiedades:

<property>

 <name>yarn.nodemanager.aux-services</name>

 <value>mapreduce_shuffle</value>

 </property>

  <property>

 <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

 <value>org.apache.hadoop.mapred.ShuffleHandler</value>

 </property>

El quinto archivo es mapred-site.xml.template. Este debe ser renombrado a mapred-site.xml.  El mismo especifica que framework se utilizara para mapreduce

sudo cp /usr/local/hadoop-2.7.0/etc/hadoop/mapred-site.xml.template /usr/local/hadoop-2.7.0/etc/hadoop/mapred-site.xml

Ahora, dentro de este archivo buscamos los tags <configuration></configuration> y le agregamos la propiedad:

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

Previo a editar el ultimo archivo vamos a crear los directorios que contendran el namenode y datanode que utiliza el sistema de archivos de hadoop, el hdfs.

sudo mkdir -p /usr/local/hadoop_store/hdfs/{namenode,datanode} && sudo chown -cR [user].[group] /usr/local/hadoop_store/hdfs/{namenode,datanode}

Si hacemos

ls -lh /usr/local/hadoop_store/hdfs/

Vamos a comprobar que realmente le cambiamos el owner a dichos directorios

Además de crear los directorios, le cambiamos el owner a nuestro usuario y grupo (reemplazar por nombre de usuario y grupo, ej. hamlet.root)

Ahora si, vamos a editar el archivo hdfs-site.xml. Este tiene que configurarse para cada nodo que vayamos a usar en nuestro cluster. Su función es especificar los directorios que van a ser usados como namenode y datanode. De nuevo buscamos el tag <configuration></configuration> y agregamos las propiedades:

<property>

       <name>dfs.replication</name>

       <value>1</value>

</property>

<property>

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

       <value>file:/usr/local/hadoop_store/hdfs/namenode</value>

</property>

<property>

       <name>dfs.datanode.data.dir</name>

       <value>file:/usr/local/hadoop_store/hdfs/datanode</value>

</property>

Ya casi estamos

Después de completar la instalación es necesario que formateemos el sistema de archivos de hadoop

hdfs namenode -format

Es importante tener en cuenta que esto formateara nuestro hdfs con lo cual perderemos toda la informacion en él. Esto es irrelevante cuando estamos haciendo pruebas y jugando, pero cuando trabajamos con informacion real puede llevarnos mucho tiempo recuperar los datos que hay en el hdfs, o bien perderlos definitivamente

Ahora podemos iniciar nuestro framework. corremos el comando

start-dfs.sh

Si todo salio bien nos va a pedir si deseamos validar la key ssh que creamos anteriormente una para el namenode y otra para el datanode.

Ahora ejecutemos el comando

start-yarn.sh

Hecho esto ya tenemos a hadoop listo para trabajar. podemos verificar que el cluster local esta funcionando correctamente con el comando jps (java process status tool) el cual nos mostrara los procesos

8066 NameNode

8196 DataNode

8420 SecondaryNameNode

8580 ResourceManager

8710 NodeManager

9007 Jps

Caso contrario no aparecerán los mismos.

Problemas comunes

Al momento de realizar la instalación me encontré con algunos problemas que voy a mencionar para ayudarlos.

 

  1. Al correr el comando start-dfs.sh habia un error con la variable $JAVA_HOME. si tenemos un error con la misma bastaría con agregar la misma entrada que agregamos en .bashrc, pero en el archivo /etc/environment
    export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45
  2. Al correr el comando start-dfs.sh aparece entre la lista un error de permiso negado/usr/local/hadoop-2.7.0’: Permission denied. Puede ser que nuestro usuario no tenga permiso de lectura/escritura en la carpeta de hadoop. esto lo cambiamos facilmente

          sudo chown -cR hamlet.root /usr/local/hadoop-2.7.0/

La verdad que la instalación en primera instancia parece mucho mas complicada de lo que realmente es, aunque debo confesar que encontrarle la vuelta, me llevo bastante tiempo en su momento.

Como no quiero dormir a la audiencia en general, dejo pasar algunos temas por alto, como por ejemplo los modos en que Hadoop corre: Local, pseudo-distribuido o bien distribuido. Por el momento es suficiente info para un solo post =)

Les deseo unas buenas noches

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

tres + uno =