1. Introducción al Framework Apache Hadoop.
Primeros pasos con el Framework Apache Hadoop: Para poner en contexto lo que es Hadoop podemos decir que se trata de un framework opensource escrito en Java utilizado principalmente para ejecutar aplicaciones distribuidas bajo un cluster de máquinas ‘commodity’.
Dispone de un sistema de archivos propio: el HDFS (Hadoop Distributed File System). Se trata de un sistema de archivos distribuido en cada nodo del cluster. Utiliza un tamaño de bloque de entre 64Mb y 128Mb y está pensado para trabajar con grandes ficheros de datos. Está basado en el Google File System (GFS) creado en 2003 ya que en ese momento Google comprobó que los sistemas utilizados hasta entonces para tratar con toda la información de que disponían no eran suficientes. Necesitaban un sistema de ficheros distribuido, escalable, tolerante a fallos, con un intensivo acceso a datos y alta concurrencia.
En 2006 Dough Cutting crea Hadoop en un sistema de procesar datos a nivel web. En 2008 se gradúa como proyecto independiente de Apache Software Foundation.
Se basa en el paradigma MapReduce utilizado para paralelizar procesos en dos fases. La fase de mapeo donde se realiza el ‘escaneo’ o recogida de los datos de entrada produciendo una lista de pares (clave, valor). Estos pares son agrupados por clave y pasados a la función reduce que se encarga de procesarlos y generar un resultado agrupado de los mismos.
Hay varias formas de utilizar el Framework Apache Hadoop. Dependiendo de nuestras necesidades podemos optar a varios tipos de instalación o modos de funcionamiento:
- Un único nodo en local (single node), utilizado por ejemplo para hacer pruebas de concepto corriendo Hadoop en una misma máquina
- Un cluster pseudo-distribuido para simular un cluster de varios nodos pero corriendo en una misma máquina es decir en la misma Java VM.
- Montar un cluster entre distintas máquinas (multi node) totalmente distribuido que sería el modo que utilizaríamos para montar un sistema Big Data en producción.
En este tutorial vamos a mostrar la forma de instalar el Framework Apache Hadoop en Linux de forma pseudo-distribuida.
2. Entorno.
El tutorial se ha realizado con el siguiente entorno:
- Ubuntu 12.04 64 bits
- Oracle Java SDK 1.6.0_27
- Framework Apache Hadoop 2.2.0
3. Instalación de Framework Apache Hadoop.
Vamos a partir de que en la máquina ya está instalada una JDK de Java, preferiblemente la 1.6. Lo primero que haremos, obviamente será descargar el Framework Apache Hadoop de la página oficial. Descargar versión 2.2.0
A continuación muestro los pasos para descomprimir el archivo y copiarlo a un directorio de nuestro equipo.
1
2
3
|
sudo tar xzf hadoop–2.2.0.tar.gz
mv hadoop–2.2.0 /usr/local/
mv /usr/local/hadoop–2.2.0 /usr/local/hadoop
|
Es una buena práctica crear un usuario y un grupo específico para configurar y administrar el Framework Apache Hadoop. Pongo los pasos necesarios para crear el usuario, asignarle la password, añadir el usuario al fichero sudoers, etc.
1
2
3
4
|
useradd –d /home/hadoop –m hadoop
passwd hadoop
usermod –a –G sudo hadoop
usermod –s /bin/bash hadoop
|
Nos logamos en la máquina con el usuario hadoop su hadoop
. A continuacion añadimos las variables de entorno para hadoop en el $HOME/.bashrc.
1
2
3
4
5
6
7
|
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
|
Una vez editado el .bashrc hacemos un source .bashrc
para cargar la nueva configuración. Para comprobar que todo ha ido bien escribimos en la consola hadoop version
y nos debería devolver la versión del Framework Apache Hadoop con la que estamos trabajando.
3.1 Configuración de SSH.
Ahora vamos a configurar el ssh para que el Framework Apache Hadoop pueda autenticarse con una clave pública y acceder a los nodos del cluster y sobre la máquina local para el usuario que creamos anteriormente. Generaremos una nueva clave pública añadiéndola al directorio de claves del usuario. No debemos poner password ya que hadoop necesita poder conectarse al cluster directamente, imaginad si cada vez que intenta acceder a un nodo del cluster tuvieramos que meter contraseña!
1
2
3
|
sudo apt–get install ssh
ssh–keygen –t rsa –f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
|
Le damos permisos:
1
2
3
|
sudo chmod go–w $HOME $HOME/.ssh
sudo chmod 600 $HOME/.ssh/authorized_keys
sudo chown `whoami` $HOME/.ssh/authorized_keys
|
Para comprobar que se ha instalado correctamente puedes ejecutar el comando ssh localhost
y si se conecta es que todo ha ido bien. Si no fuera así revisa los pasos anteriores. Salimos de la sesión ssh con exit
.
Para dejar lista la configuración de Ubuntu debemos deshabilitar IPv6 ya que como dice la documentación oficial, Hadoop no lo admite para gestionar correctamente el cluster. Ubuntu trae por defecto esta configuración por lo que debemos desactivarla. Para ello añadimos las siguientes líneas al fichero /etc/sysctl.conf
.
1
2
3
|
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
|
Para que coja los cambios debemos reiniciar la máquina. Una vez reiniciada podemos comprobar que ha cogido bien la nueva configuración con el comando cat /proc/sys/net/ipv6/conf/all/disable_ipv6
.
4. Arquitectura HDFS.
HDFS es una implementación del sistema de ficheros descrito en el paper de Google (GFS). Sigue una filosofía “Write once, read more” en concreto para albergar grandes ficheros y principalmente pensado para programas batch donde los datos no son en tiempo real.
En HDFS se trabaja con una cantidad mínima de información llamada bloque que normalmente estará comprendida entre 64-128 Mb debido a que se trabaja con ficheros muy grandes (Gigabytes, Petabytes…). El objetivo de HDFS es dividir el fichero en bloques de tamaño fijo y distribuirlo en los distintos nodos del cluster. Debido a que se produce mucho tráfico por la red para distribuir la información con el coste que esto conlleva se opta por un tamaño de bloque alto. Recuerdo que HDFS es tolerante a fallos y caídas de nodos del cluster por lo que se replica la información en varios nodos (por defecto 3 veces).
La gestión del cluster la realiza el NameNode. Es el nodo maestro encargado de gestionar los metadatos de los ficheros y los directorios, coordina los bloques que se envían a cada datanode monitorizando su estado para asegurar que todos los trabajos se completan correctamente, redirigiendo bloques a otros datanodes si alguno estuviera caído. La información de los metadatos se almacena en memoria RAM para que el acceso sea más rápido. El NameNode es vital en el cluster por lo que se suele montar en una máquina mucho más potente que para los datanodes con mayor capacidad de proceso y sobre todo mucha memoria RAM.
Los DataNodes son los nodos esclavos encargados del almacenamiento de los bloques realizando las operaciones de lectura y escritura. Estos informan al NameNode de los bloques almacenados.
El SecondaryNameNode es un servicio auxiliar y opcional en el cluster. Es un error pensar que se trata de un segundo Namenode por si el primero fallara. Puede usarse como backup de los metadatos.
4.1 Configuración HDFS.
Con la instalación que hemos realizado hasta ahora tendríamos un nodo de hadoop instalado en la máquina. Si queremos configurar hadoop en un modo pseudo-distribuido debemos modificar algunos ficheros de configuración. Nos situamos en el directorio /user/local/hadoop/etc/hadoop y editamos el fichero core-site.xml
1
2
3
4
5
6
7
8
9
10
|
<?xml version=«1.0»?>
<?xml–stylesheet type=«text/xsl» href=«configuration.xsl»?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
<description>Nombre del filesystem por defecto.</description>
</property>
</configuration>
|
Esto configura el directorio hdfs por defecto en localhost.
A continuación configuramos algunas propiedades del sistema de ficheros en el fichero hdfs-site.xml. Como estamos configurando un cluster en un única máquina no tiene sentido indicar un factor de replicación mayor a 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version=«1.0»?>
<?xml–stylesheet type=«text/xsl» href=«configuration.xsl»?>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/workspace/dfs/name</value>
<description>Path del filesystem donde el namenode almacenará los metadatos.</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/workspace/dfs/data</value>
<description>Path del filesystem donde el datanode almacenerá los bloques.</description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Factor de replicación. Lo ponemos a 1 porque sólo tenemos 1 máquina.</description>
</property>
</configuration>
|
Creamos los directorios /home/hadoop/workspace/dfs/name y /home/hadoop/workspace/dfs/data
1
2
|
mkdir /home/hadoop/workspace/dfs/name
mkdir /home/hadoop/workspace/dfs/data
|
Editamos ahora el fichero hadoop-env.sh para indicar el directorio JAVA_HOME de nuestra máquina.
1
|
export JAVA_HOME=/usr/lib/jvm/java–6–oracle
|
Otra propiedad que vamos a configurar será la que configura los directorios donde se realiza el MapReduce, editamos el mapred-site.xml. También configuraremos el MapReduce de nuestro Hadoop al nuevo framework MapReduce disponible a partir de la versión 2 de Hadoop llamado Yarn (Yet Another Resource Negotiator). Es un framework MapReduce mejorado capaz de realizar más trabajos y un sinfín de cosas más que veremos en otros tutoriales. De momento lo dejaremos configurado. Como nuestro cluster es pseudo-distribuido únicamente habrá una tarea map y una reduce.
Por defecto viene como mapred-site.xml.template por lo que hacemos una copia y renombramos a mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?xml version=«1.0»?>
<?xml–stylesheet type=«text/xsl» href=«configuration.xsl»?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>file:/home/hadoop/workspace/mapred/system</value>
<final>true</final>
</property>
<property>
<name>mapred.local.dir</name>
<value>file:/home/hadoop/workspace/mapred/local</value>
<final>true</final>
</property>
</configuration>
|
Creamos los directorios:
1
2
|
mkdir /home/hadoop/workspace/mapred/system
mkdir /home/hadoop/workspace/mapred/local
|
Por último configuramos un par de propiedades en el yarn-site.xml. Habilitamos la fase de Suffle para que se pueda hacer entre las fases de Map y Reduce ya que YARN por defecto no lo incluye.
1
2
3
4
5
6
7
8
9
10
|
<configuration>
<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>
</configuration>
|
Una vez instalado Hadoop vamos a comentar algunos comandos que se utilizan normalmente a la hora de trabajar con un cluster Hadoop. Lo primero será formatear el sistema de ficheros HDFS mediante el comando:
1
|
hadoop namenode –format
|
Lo siguiente será arrancar el cluster, es decir los diferentes demonios (Namenode, Datanode…) encargados de la ejecución de las tareas MapReduce y de la gestión del sistema de ficheros HDFS. Para hacer esto ejecutamos el script start-all.shz
situado en /usr/local/hadoop/sbin/
1
|
./start–all.sh
|
Si ejecutamos el comando Jps que nos muestra los procesos Java corriendo en la máquina debería salir algo como esto:
1
2
3
4
5
6
7
|
hadoop@juan:/usr/local/hadoop/sbin$ jps
11461 DataNode
11706 SecondaryNameNode
12875 NodeManager
12675 ResourceManager
11268 NameNode
13151 Jps
|
Una vez arrancado podemos acceder al interfaz WebUI en http://localhost:8088/cluster/nodes
donde podemos realizar el seguimiento de los jobs que vayamos ejecutando. Es también muy útil para ver los logs, el histórico de jobs ejecutados, la configuración de MapReduce, etc.
Otra interfaz muy útil para ver la información del NameNode es accesible en http://localhost:50070/dfshealth.jsp
. Aquí podemos ver la información de nuestro NameNode y también podemos acceder de forma visual al filesystem hdfs.
5. Conclusiones.
En este tutorial he querido hacer una primera introducción a la arquitectura de Hadoop, su instalación, configuración y arranque. En sucesivos tutoriales iremos entrando en detalle en los aspectos más destacados de la arquitectura y veremos las distintas partes en que se compone.
Espero que te haya sido de ayuda.