herramientas y ejemplos de trabajos mapreduce con apache hadoop

27
Informática como Servicio Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop David Albela Pérez

Upload: david-albela

Post on 13-Dec-2014

788 views

Category:

Software


12 download

DESCRIPTION

Trabajo de sobre herramientas ejemplo de trabajo Mapreduce en un clúster de Hadoop.

TRANSCRIPT

Page 1: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Informática como Servicio

Herramientas y ejemplos de trabajosMapReduce con Apache Hadoop

David Albela Pérez

Page 2: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop
Page 3: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.

Page 4: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Tabla de Contenidos

1.Introducción.......................................................................................................................................42.Requisitos previos.............................................................................................................................5

2.1.Instalación de JDK.....................................................................................................................52.2.Añadir repositorio de Cloudera..................................................................................................5

3.Instalación en modo pseudo-distribuído............................................................................................63.1.Instalación en Debian 7 o superior............................................................................................63.2.Configuración............................................................................................................................73.3.Probar MapReduce....................................................................................................................8

4.Sqoop.................................................................................................................................................94.1.Instalación de Sqoop..................................................................................................................94.2.Importar la Base de Datos........................................................................................................10

5.Hive.................................................................................................................................................125.1.Instalación de Hive..................................................................................................................125.2.Ejemplo en Hive......................................................................................................................15

6.Impala..............................................................................................................................................176.1.Instalación................................................................................................................................176.2.Configuración..........................................................................................................................186.3.Ejemplo con Impala.................................................................................................................19

7.MapReduce con Eclipse..................................................................................................................208.Múltiples Mappers...........................................................................................................................269.Bibliografía......................................................................................................................................26

Page 5: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

1. Introducción

En esta memoria se explica el desarrollo de una aplicación MapReduce con la versión de Hadoop 0.20 a partir de los repositorios de Cloudera, utilizando la última versión estable de Cloudera CDH4.5.

Para la implemetación del código se utiliza el lenguaje Java, con el IDE de desarrollo Eclipse y el repositorio de Maven para instalar las dependencias.

Para más información http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/

Page 6: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

2. Requisitos previos

Antes de instalar Hadoop en un único nodo se deberá realizar la instalación de los paquetes básicos. En primer lugar es necesario instalar la versión de Java oficial de Oracle JDK 7.

2.1. Instalación de JDK

Aunque se recomienda instalar Oracle JDK 1.7 para algunos paquetes específicos como Impala a continuación se detalla la instalación de la versión OpenJDK de los repositorios de Debian.

$ sudo apt-get install openjdk-7-jdk

Incluir la ruta de instalación en $JAVA_HOME

$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

$ export PATH=$JAVA_HOME/bin:$PATH

Añadir las variables de entorno a ~/.bashrc

2.2. Añadir repositorio de Cloudera

Para la instalación de Hadoop con Cloudera es necesario añadir su repositorio, en el caso CDH4, al sistema operativo. Cloudera tiene soporte para los sistemas operativos basados tanto en Debian como RedHat y provee de los paquetes necesarios para su instalación básica.

1. Instalación desde Debian Squeeze 6 (compatible con Debian Jessie 7)

• Descargar e instalar el paquete

$ wget http://archive.cloudera.com/cdh4/one-click-install/squeeze/amd64/cdh4-repository_1.0_all.deb

$ sudo dpkg -i cdh4-repository_1.0_all.deb

• Instalar clave pública GPG (requiere tener instalado el paquete curl)

$ curl -s http://archive.cloudera.com/cdh4/debian/squeeze/amd64/cdh/archive.key |sudo apt-key add -

• Opcionalmente se puede instalar el repositorio manualmente

2. Instalación desde Debian 6 Squeeze

• Crear una lista nueva en /etc/apt/sources.list.d/cloudera.list$ sudo touch /etc/apt/sources.list.d/cloudera.list

# Añadir a la lista las siguientes línea:deb [arch=amd64] http://archive.cloudera.com/cdh4/debian/squeeze/amd64/cdh squeeze-cdh4 contrib

deb-src http://archive.cloudera.com/cdh4/debian/squeeze/amd64/cdh squeeze-cdh4 contrib

En caso de que el sistema operativo no sea compatible también están disponibles los ficheros binarios tarballs (tar.gz o tar.bz) en la siguiente dirección web: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDHTarballs/3.25.2013/CDH4-Downloadable-Tarballs/CDH4-Downloadable-Tarballs.html

Page 7: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

3. Instalación en modo pseudo-distribuído

En este apartado se explica la instalación de Hadoop 0.20 en modo pseudo-distribuído.

Para la instalación de Hadoop en modo pseudo-distribuído se pueden encontrar los paquetes de configuración básica en el repositorio de CDH4 con el nombre de hadoop-0.20-conf-pseudo.

3.1. Instalación en Debian 7 o superior

Cloudera CDH4 solo da soporte para Debian 6 Squeezy. Sin embargo en versiones superiores se puede realizar la instalación con algunos cambios. A continuación se detalla el proceso de instalación en Debian Wheezy 7 o superior:

1. Añadir lista de paquetes de la versión Squeezy

$ sudo vi /etc/apt/sources.list

deb http://ftp.udc.es/debian/ squeeze main contrib

deb-src http://ftp.udc.es/debian/ squeeze main contrib

NOTA: No se recomienda realizar ningún dist-upgrade con estas fuentes, una vez instaladas los paquetes con las dependencias necesarias se recomienta comentar o eliminar de la lista.

2. Actualizar repositorios

$ sudo apt-get update

3. Es necesario instalar el paquete libssl 0.9.8 para los paquetes de Hadoop 0.20 MapReduce.

$ sudo apt-get install libssl 0.9.8

4. Instalación

$ sudo apt-get install hadoop-0.20-conf-pseudo

El paquete hadoop-0.20-conf-pseudo instalará automáticamente los siguientes paquetes:

• hadoop: Binarios principales del paquete de Hadoop.

• hadoop-0.20-mapreduce: MapReduce versión 1.

• hadoop-0.20-mapreduce-jobtracker: Servicio JobTracker. Este demonio se encargará dedistribuír los trabajos enviados por el cliente a los distintos TraskTrackers. Normalmente seejecuta en el nodo maestro denominado NameNode. Este paquete no incluye JobTracker enmodo de alta disponibilidad (HA).

• hadoop-0.20-mapreduce-tasktracker: Servicio TaskTracker. Este demonio se encarga deejecutar las tareas Map y Reduce en cada nodo esclavo denominados DataNodes.

• Hadoop-hdfs : Sistema de fichero HDFS.

• Hadoop-hdfs-datanode: Servicio DataNode. Se instala en los nodos esclavos. CadaDataNode se encarga de almacenar un conjunto de bloques de HDFS así como un checksumpara validar que no está corrupto. Un nodo maestro o NameNode puede ser tambiénDataNode.

• Hadoop-hdfs-namenode: Servicio NameNode. Se instala en el nodo maestro. Se encargade gestionar la metainformación de los ficheros almacenados en HDFS así como guardar unregistro de los bloques que contiene cada fichero y en que DataNodes están. Cuando seguarda un bloque automáticamente se almacenan 3 réplicas en diferentes DataNodes. ElNameNode también se encarga de solicitar nuevas réplicas en caso de encontrarse bloques

Page 8: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

corruptos o caer algún DataNode. Si el NameNode cae no se puede acceder al sistema deficheros HDFS.

• Hadoop-hdfs-secondarynamenodelib: Servicio SecondaryNameNode se trata de unNameNode secundario que libera de carga para la actualización del registro de bloques-archivo del NameNode principal. Este NameNode secundario no provee de altadisponibildad al NameNode principal.

3.2. Configuración

Con Hadoop instalado en modo pseudo-distrinbuído se procede a la configuración de los archivos. Antes de comenzar se recomienda comprobar la instalación:

$ dpkg -L hadoop-0.20-conf-pseudo

Una vez verificada la instalación en /etc/hadoop/conf/ se pueden encontrar los siguientes archivos de configuración:

• core-site.xml: Contiene la configuración de propiedades generales de Hadoop.

• hdfs-site.xml: Configuración de propiedades del sistema de ficheros HDFS.

• mapred-site.xml: Propiedades de MapReduce.

NOTA: En el caso de haber instalado Hadoop 2.0 o superior se incluiría el fichero de configuraciónyarn-site.xml para definir propiedades de MapReduce versión 2.

A continuación se describen los pasos necesarios para terminar de configurar Hadoop en modo pseudo-distribuído:

1. Formatear el NameNode. Antes de iniciar el NameNode por primera vez se debe formatear el sistema de ficheros HDFS

$ sudo -u hdfs hdfs namenode -format

El usuario que tiene permisos para formatear HDFS es hdfs, por eso es necesario ejecutar el comando “hdfs namenode -format” como usuario hdfs.

2. Iniciar HDFS

$ for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done

# Comprobar los servicios

$ sudo jps

Deberían de aparecer NameNode, DataNode y SecondaryNameNode.

3. Añadir ejecutable java slf4j-simple-1.7.5.jar a la ruta de hdfs

$ sudo ln -s /usr/share/java/slf4j-simple-1.7.5.jar /usr/lib/hadoop-hdfs/lib/slf4j-simple-1.7.5.jar

4. Crear directorio temporal

$ sudo -u hdfs hadoop fs -mkdir /tmp

$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp

5. Crear los directorios de sistema de MapReduce

$ sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging

$ sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging

Page 9: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

$ sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred

6. Verificar la estructura del sistema de archivos

$ sudo -u hdfs hadoop fs -ls -R /

La salida obtenida debería ser como el siguiente ejemplo

7. Iniciar MapReduce

$ for x in `cd /etc/init.d ; ls hadoop-0.20-mapreduce-*` ; do sudo service$x start ; done

# Comprobar los procesos

$ sudo jps

8. Crear directorios de usuario

$ sudo -u hdfs hadoop fs -mkdir /user/[user]

$ sudo -u hdfs hadoop fs -chown [user] /user/[user]

3.3. Probar MapReduce

Una vez creada la estructura necesaria para que los usuarios puedan almacenar datos en HDFS y ejecutar tareas MapReduce se prueba a ejecutar un ejemplo incluído por defecto en el repositorio deHadoop.

1. Crear el directorio de entrada de datos input

$ hadoop fs -mkdir input

2. Copiar los datos de configuración de Hadoop para el ejemplo

$ hadoop fs -put /etc/hadoop/conf/*.xml input

$ hadoop fs -ls input

3. Ejecutar el trabajo con salida en el directorio output

$ /usr/bin/hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar grep input output 'dfs[a-z.]+'

Page 10: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

NOTA: El directorio output no debe existir.

4. Listar el resultado

$ hadoop fs -ls output

$ hadoop fs -cat output/part-00000 | head

4. Sqoop

Para importar los datos necesarios de una base de datos MySQL se utiliza la herramientaSquoop que permite importar/exportar datos de una base de datos relacional en HDFS.

4.1. Instalación de Sqoop

Para la instalación de sqoop solo se requiere la instalación del cliente y añadir los drivers JDBCde las bases de datos que se quieren importar.

$ sudo apt-get install sqoop

# Comprobar la instalación de sqoop

$ sqoop help

$ sqoop version

# Instalar la base de datos MySQL

$ sudo apt-get install mysql

# Durante la instalación se pedirá introducir la contraseña de root.

# Instalar los drivers JDBC de MySQL

$ sudo apt-get install libmysql-java

# Localizar la ubicación del driver

$ sudo dpkg -L libmysql-java

Page 11: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

# Crear enlace simbólico del conector de MySQL en la ruta de configuraciónde Sqoop.

$ sudo ln -s /usr/share/java/mysql-connector-java.jar /usr/lib/sqoop/lib/

4.2. Importar la Base de Datos

Con Sqoop instalado y los drivers JDBC necesarios y copiados en la ruta del cliente se puedeimportar una base de datos. A continuación se detallan los pasos de la importación de una base dedatos de MySQL:

1. Crear una base de datos de prueba.

$ sudo service mysql start

$ mysql -u root -p

mysql> create database translator DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

mysql> grant select,insert,update,delete ON translator.* TO training@localhost IDENTIFIED BY 'training';

mysql> quit

2. Crear tablas y datos de pruebas. Para ello se utiliza un script existente con una base de datosque contiene cerca de 10.000 registros en la tablas binary_texts.

$ mysql -u training -p translator < script.sql

$ mysql -u training -p translator

mysql> show tables;

3. Importar de la base de datos una tabla del primer registro.

# Importar datos de binary_files

Page 12: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

$ sqoop import --connect jdbc:mysql://localhost/translator --table binary_files--columns "id, filename, description" --fields-terminated-by '\t' --usernametraining --password training

# Importados datos de binary_texts

$ sqoop import --connect jdbc:mysql://localhost/translator --table binary_texts--columns "id, binary_file_id, english, spanish, modified" --fields-terminated-by '\t' --inline-lob-limit 1024 --username training --password training

El parámetro --inline-lob-limit indica que los datos no sean almacenen fuera de la línea hastasuperar los 1024 bytes.

Cuando se realiza la ejecución de importación se lanza automáticamente un trabajo Map, sin la faseReduce.

Los datos de salida se guardan automáticamente en la ruta de HDFS /user/{usuario}/{tabla} donde{usuario} es el usuario que ejecuta el comando sqoop import y {tabla}, el nombre de la tablaimportada.

En la ruta del usuario del sistema operativo se crea una clase java con el nombre de la tablaimportada que contiene el MapReduce.

Page 13: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

4. Ver el contenido importado en HDFS.

$ hadoop fs -ls binary_files

$ hadoop fs -tail binary_texts/part-m-00000

En los ficheros part-m-xxxxx estan los datos importados. La m indica que son salidas de tareas tipoMap.

5. Hive

Hive fue desarrollado por el equipo de Facebook para realizar el análisis de gran canditadad dedatos con trabajos MapReduce lanzados de forma automática a través de sentencias SQL.

Hive traduce consultas de SQL en trabajos MapReduce.

Requiere del servicio MetaStore con una base de datos relacional que almacene los metadatosde HDFS. Es decir, relacionar los datos que se encuentran en HDFS, por cada línea de un fichero obloque de datos en HDFS utilizando tablas y campos en la base de datos relacional de MetaStore.

5.1. Instalación de Hive

En este apartado se describen los pasos de la instalación de Hive versión cliente.

# Instalar cliente de Hive

$ sudo apt-get install hive

# instalar MetaStore

$ sudo apt-get install hive-metastore

A continuación se realiza la configuración de MetaStore, servicio que almacena los metadatosnecesarios para las tablas y particiones de datos de Hive en una base de datos relacional. Para ellose configurará MetaStore en modo local con una base de datos MySQL.

# Instalar los paquetes$ sudo apt-get install mysql-server

# Iniciar el servicio de MySQL$ sudo service mysql start

# Instalar el driver jdbc$ sudo apt-get install libmysql-java$ sudo ln -s /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib

Page 14: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

# Si no se ha configurado la contraseña de root para MySQL$ sudo /usr/bin/mysql_secure_installation

Con MySQL y el driver JDBC instalados, falta crear la base de datos para MetaStore y el usuario con acceso. El esquema de la base de datos se encuentra en la ruta de instalación de Hive.

# Por defecto arranca en inicio# Para desactivar el inicio automatico# sudo update-rd.d -f mysql remove

# Para activarlo de nuevo$ sudo chkconfig mysql on

# Acceder a MySQL con privilegios de administrador$ mysql -u root -p

mysql> CREATE DATABASE metastore;mysql> USE metastore;mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.10.0.mysql.sql;

También es necesario crear una cuenta de usuario con acceso a la base de datos MySQL para acceder a la MetaStore.

Es importante evitar que esta cuenta de usuario tenga permisos de creación o modificación de tablasen el esquema de la base de datos de MetaStore.

mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'password';...mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'localhost';mysql> GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES,EXECUTE ON metastore.* TO 'hive'@'localhost';mysql> FLUSH PRIVILEGES;mysql> quit;

Una vez está creada la base de datos y el usuario con acceso a ella se procede a configurar MetaStore en el fichero de configuración hive-site.xml. Las propiedades que vienen por defecto en el fichero se sustituyen por las indicadas a continuación.

Page 15: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

$ sudo vi /etc/hive/conf/hive-site.xml<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/metastore</value> <description>the URL of the MySQL database</description></property>

<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value></property>

<property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value></property>

<property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> <description>Indicar la contraseña de la bd</description></property>

<property> <name>datanucleus.autoCreateSchema</name> <value>false</value></property>

<property> <name>datanucleus.fixedDatastore</name> <value>true</value></property>

<property> <name>datanucleus.autoStartMechanism</name> <value>SchemaTable</value></property>

<property> <name>hive.metastore.uris</name> <value>thrift://127.0.0.1:9083</value> <description>IP address (or fully-qualified domain name) and port of the metastore host</description></property>

La propiedad hive.metastore.uris debe estar en todos los host cliente, metastore y HiveServer. Las demás propiedades solo son necesarias en el nodo donde se instale el paquete de MetaStore.

Es necesario crear una ruta temporal y otra para el MetaStore en el sistema de ficheros de HadoopHDFS.

# Crear tmp en HDFS si no existe

$ sudo -u hdfs hdfs dfs -ls /tmp

$ sudo -u hdfs hdfs dfs -mkdir /tmp

$ sudo -u hdfs hdfs dfs -chmod 1777 /tmp

# Crear directorio para hive Metastore

$ sudo -u hdfs hdfs dfs -mkdir /user/hive/warehouse

Page 16: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

$ sudo -u hdfs hdfs dfs -chmod 1777 /user/hive/warehouse

$ sudo -u hdfs hdfs dfs -ls /user/hive

Instalar e iniciar el servicio de MetaStore

$ sudo apt-get install hive-metastore

$ sudo service hive-metastore start

Iniciar hive

$ hive

hive> SHOW TABLES;

hive> quit;

Comprobar en otra terminal que el servicio está ejecutándose en la JVM con jps y con ps (RunJar)

$ sudo jps

$ ps -ef | grep RunJar

5.2. Ejemplo en Hive

Para ejecutar un ejemplo en Hive se necesitan tener datos estructurados en un formatocualquier en HDFS. En este ejemplo se utilizarán los datos importados de la base de datostranslator del capítulo de Sqoop.

Los datos que se van a utilizar son los de la tabla binary_files almacenados en la ruta/user/hdfs/binary_texts

Hay que tener en cuenta donde se situa cada columna en los ficheros de la ruta y cual es laseparación de cada campo. En el ejemplo, la primera columna hace referencia al campo english y lasegunda la columna spanish. Ambas columnas están separadas por una tabulación (\t). Los ficherosque comienzan por “_” se ignoran.

Desde un terminal ejecutar hive y crear la tabla que relacionará los datos en HDFS.

$ hive

Page 17: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

hive> CREATE EXTERNAL TABLE translator (id_text INT, binary_file_id INT, englishSTRING, spanish STRING, created TIMESTAMP) ROW FORMAT DELIMITED FIELDSTERMINATED BY '\t' LOCATION '/user/david/binary_texts';

La ruta indicada en LOCATION tiene que ser absoluta.

Se pueden eliminar tablas creadas en el MetaStore

hive> drop table borrar_tabla;

Ahora los datos de la ruta indicada están relacionados con sus metadatos en MetaStore y se puedenejecutar trabajos MapReduce.

hive> SELECT COUNT(*) FROM translator;

El resultado se muestra al finalizar las tareas Reduce junto con el tiempo de ejecución total.

hive> select * from translator where id_text=5;

Page 18: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

También se pueden realizar consultas más complejas con JOIN, GROUP, ORDER, y condicionesWHERE o HAVING.

6. Impala

Impala es una herramienta de código abierto creada por Cloudera que permite a los usuariosconsultar los datos en HDFS usando HiveQL. Utiliza la misma MetaStore compartida por Hive.

La diferencia principal con Hive es que no lanza trabajos MapReduce. Los resultados de lasconsultas de Impala son significativamente más rápidos que en Hive, entre 10 o 50 veces másrápido.

6.1. Instalación

Impala se instala desde un repositorio aparte del resto de aplicaciones. Para instalar Impalaantes es necesario añadir el repositorio de Impala en la lista de fuentes de paquetes de Cloudera.

$ sudo vi /etc/apt/sources.list.d/cloudera.list

deb http://archive.cloudera.com/impala/debian/squeeze/amd64/impala squeeze-impala1 contribdeb-src http://archive.cloudera.com/impala/debian/squeeze/amd64/impala squeeze-impala1 contrib

$ sudo apt-get update

Impala crea y utiliza el usuario y grupo impala. Se crea automáticamente durante la instalación y nose debe eliminar.

Por otro lado, para el uso de la papelera .trash en HDFS a la hora de eliminar tablas de la MetaStore(DROP TABLE) con Impala Shell se debe crear la carperta del usuario en /user/impala.

$ sudo -u hdfs hadoop fs -mkdir /user/impala

$ sudo -u hdfs hadoop fs -chown impala /user/impala

Page 19: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Antes de instalar Impala es necesario tener el MetaStore local o compartido de Hive. Para la instalación de esta memoria se utiliza el MetaStore instalado en la sección de Hive.

Cloudera recomienda las siguitentes propiedades de configuración en Hive.

$ sudo vi /etc/hive/conf/hive-site.xml

<property><name>hive.metastore.uris</name><value>thrift://127.0.0.1:9083</value><description>La IP del host MetaStore. Ya añadido en la sección de la

instalación de Hive.</description></property>

<property><name>hive.metastore.client.socket.timeout</name><value>3600</value><description>MetaStore Client socket timeout in seconds</description>

</property>

A continuación se instalan los paquetes de Impala

$ sudo apt-get install impala # Binaries for daemons$ sudo apt-get install impala-server # Service start/stop script$ sudo apt-get install impala-state-store # Service start/stop script$ sudo apt-get install impala-catalog # Service start/stop script

No se recomienda instalar Impala en nodos NameNode de un clúster ya que requiere de una gran cantidad de memoria para ejecturar las consultas causando un impacto negativo en el proceso del NameNode.

Para instalar el cliente de Impala en los host que realizarán las consultas ejecutar el siguiente comando.

$ sudo apt-get install impala-shell

6.2. Configuración

Configurar en todos los nodos Impala DataNode las siguientes propiedades en core-site.xml y hdfs-site.xml

$ sudo vim /etc/hadoop/conf/core-site.xml

<!-- IMPALA Config --> <property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <!-- IMPALA Config -->

$ sudo vim /etc/hadoop/conf/hdfs-site.xml

<!-- IMPALA Config --> <property> <name>dfs.client.read.shortcircuit</name> <value>true</value></property>

Page 20: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

<property> <name>dfs.domain.socket.path</name> <value>/var/run/hadoop-hdfs/dn._PORT</value></property>

<property> <name>dfs.client.file-block-storage-locations.timeout</name> <value>3000</value></property><!-- IMPALA Config -->

Copiar los ficheros de configuración del cliente Hive hive-site.xml y HDFS, core-site.xml y hdfs-site.xml, en la ruta de configuración de Impala /etc/impala/conf.

$ sudo cp /etc/hive/conf/hive-site.xml /etc/impala/conf/

$ sudo cp /etc/hadoop/conf/core-site.xml /etc/impala/conf/

$ sudo cp /etc/hadoop/conf/hdfs-site.xml /etc/impala/conf/

$ sudo cp /etc/hadoop/conf/log4j.properties /etc/impala/conf/

Reiniciar el DataNode

$ sudo service hadoop-hdfs-datanode restart

Si se está usando la versión de Java OpenJDK 7 en lugar de Oracle JDK 1.7 será necesario añadirtambién al final del fichero de configuración estas lineas.

# Soporte para OpenJDK

export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")

export LD_LIBRARY_PATH=/usr/lib:$JAVA_HOME/jre/lib/amd64/server

Además de quitar la ruta de libjvm.so utilizada por defecto

$ sudo mv /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/jamvm/libjvm.so /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/jamvm/libjvm.so.bak

6.3. Ejemplo con Impala

Iniciar los servicios de MySQL, MetaStore y reiniciar los de Impala

$ sudo service mysql start

$ sudo service hive-metastore start

$ sudo service impala-server restart

$ sudo service impala-state-store restart

$ sudo service impala-catalog restart

Iniciar los servicios de MySQL y MetaStore. Iniciar además los servicios de Hadoop HDFS si noestán iniciados.

$ sudo service mysql start

$ sudo service hive-metastore start

Desde un terminal ejecutar el cliente de impala y conectarse a servidor.

$ impala-shell

[Not connected] > CONNECT localhost;

Page 21: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Si al ejecutar una consulta SQL se muestra el siguiente error es debido a que el catálogo de Impalaaún no se ha actualizado a partir de la MetaStore actual.

Ejecutar las mismas consultas SQL que en el ejemplo de Hive.

[localhost:21000] > select count(*) from translator;

Cada vez que se ejecuta una misma consulta, los resultados se almacenan en el catálogo. Si se repitela misma consulta sobre los mismos datos, el resultado se obtiene en menor tiempo.

[localhost:21000] > select * from translator where id_text=5;

Como se puede apreciar el resultado de contar todas las filas dura menos de un segundo frente a los30 o 60 segundos que tarda en ejecutar la misma consulta en Hive.

7. MapReduce con Eclipse

Es posible instalar y depurar código MapReduce en el IDE Eclipse como con cualquier otroprograma. Sin embargo, hay algunas diferencias entre ejecutar un trabajo MapReduce en un clústerdistribuído a como funciona en Eclipse.

Cuando se ejecuta código MapReduce en Eclipse, Hadoop ejecuta un modo especial llamadoLocalJobRunner bajo el cual todos los trabajos lanzados se ejecutan en single node.

Page 22: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

Los requisitos para la implementación son:

• Maven 3 or superior

• Oracle JDK o la versión openJDK 1.7

• Eclipse con el plugin m2eclipse instalado.

Para la instalación de un proyecto inicial de MapReduce con Maven en eclise se realizan lossiguientes pasos basados en el blog de Hadoopi1.

1. Instalar maven y descargar la última versión de Eclipse

$ sudo apt-get install mvn

2. Añadir el repositorio de Maven de Cloudera en la carpeta .m2 del directorio homedelusuario.

$ sudo vi $HOME/.m2/settings.xml

<settings>

<profiles>

<profile>

<id>standard-extra-repos</id>

<activation>

<activeByDefault>true</activeByDefault>

</activation>

<repositories>

<repository>

<!-- Central Repository -->

<id>central</id>

<url>http://repo1.maven.org/maven2/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

<repository>

<!-- Cloudera Repository -->

<id>cloudera</id>

<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

</profile>

1 Blog de Hadoopi: http://hadoopi.wordpress.com/2013/05/25/setup-maven-project-for-hadoop-in-5mn/

Page 23: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

</profiles>

</settings>

3. Abrir Eclipse y crear un proyecto inicial.

• Ir a File -> New -> Project... y seleccionar Maven -> Maven Project.

• Pulsar en Next >

• Marcar "Create a simple project"

• En Group ID indicar una uri del projecto, por ejemplo es.udc.fic.muei.ics.mapred.userid

• En ArtifactID indicar el nombre del proyecto, por ejemplo MapReduceExample

• Indicar la versión en Version, por ejemplo 0.0.1.

• En Package indicar el nombre del paquete acorde a la uri del proyecto y el ArtifactID,por ejemplo es.udc.fic.muei.ics.mapred.userid.MapReduceExample

• Pulsar en Finish

4. Una vez creado el proyecto en Eclipse, editar el fichero pom.xml y añadir las siguienteslíneas.

<dependencyManagement>

<dependencies>

<dependency>

<groupId>jdk.tools</groupId>

<artifactId>jdk.tools</artifactId>

<version>1.7</version>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-hdfs</artifactId>

<version>2.0.0-cdh4.0.0</version>

Page 24: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-auth</artifactId>

<version>2.0.0-cdh4.0.0</version>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-common</artifactId>

<version>2.0.0-cdh4.0.0</version>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-core</artifactId>

<version>2.0.0-mr1-cdh4.0.1</version>

</dependency>

<dependency>

<groupId>org.apache.hbase</groupId>

<artifactId>hbase</artifactId>

<version>0.95.2-hadoop2</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit-dep</artifactId>

<version>4.8.2</version>

</dependency>

</dependencies>

</dependencyManagement>

<dependencies>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-hdfs</artifactId>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-auth</artifactId>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-common</artifactId>

</dependency>

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-core</artifactId>

</dependency>

<dependency>

<groupId>junit</groupId>

Page 25: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

<artifactId>junit</artifactId>

<version>4.10</version>

<scope>test</scope>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.1</version>

<configuration>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

</plugins>

</build>

Guardar el fichero pom.xml con los nuevo cambios

5. Descargar las dependencias de Maven.

• Seleccionar el proyecto creado con el botón derecho y seleccionar Maven -> Updatedependencies..., pulsar en Accept.

• Buscar las dependencias descargadas de Hadoop en el directorio del repositorio .m2.

$ find ~/.m2/repository/org/apache/hadoop -name "*.jar"

6. Abrir un terminal y desde el directorio raíz del proyecto ejecutar los comandos deinstalación de maven.

$ cd ~/workspace/MapReduceTranslator

$ mvn clean install

7. Desde eclipse configurar la ejecución del proyecto MapReduce.

• Ir a Run -> Run Configurations.

• Seleccionar del menú izquiero Java Application, pulsar el botón derecho del ratón yseleccionar “New”.

• En la pestaña Main:

◦ Poner Name como Translator, o la clase principal del proyecto a ejecutar.

◦ En Project es coger el nombre del proyecto, por ejemplo MapReduceTranslator.

◦ En Main.class seleccionar la ruta de la clase Main, por ejemplo es.udc.fic.pfc.hadoop.MapReduce.Translator.

• En la pestaña Arguments:

◦ En Program Arguments indicar el directorio de entrada, salida y el texto a traducir, por ejemplo resource/binary_texts/ output "There is nobody"

Page 26: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

• Aplicar los cambios pulsando en Apply y ejecutar el ejemplo pulsando en Run.

8. Durante la ejecución se muestra por pantalla la salida del trabajo MapReduce con lainformación del trabajo lanzado en modo single node.

9. El resultado está en el directorio indicado en los argumentos de ejecución.

Page 27: Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

El código fuente del ejemplo se puede descargar del repositorio de github en el siguiente enlacehttps://github.com/3lm4dn0/Java-examples/tree/master/hadoop/mapreduce-translator.

8. Múltiples Mappers

El proyecto creado simplemente obtiene las traducciones de frases más similares al textoindicado en la entrada estándar.

En función de número de apariciones de las palabras del texto a traducir por línea se decide sise añade como frase posible de traducción utilizando un umbral mínimo.

Una aplicación interesante es poder utilizar múltiples Mappers en el programa principal,enviándose como un único trabajo. De esta forma, teniendo un buen diccionario con muchas frasestraducidas, se podrían realizar dos flujos de trabajo:

1. Lectura de un texto considerable. Se realiza la lectura de cada línea de un texto bastantegrande y divido en varios bloques desde HDFS.

2. Lectura del diccionario. Se realiza la lectura de cada línea del diccionario.

3. Integración de los Mappers. Se realiza la comparación de los resultados de cada línea delprimer Mapper con el de la segunda entrada.

4. Un trabajo Reduce se encarga de seleccionar la mejor traducción de una lista de posiblestraducciones obtenidas en base al umbral establecido.

Para el tercer paso existe la herramienta Oozie 2que permite definir de flujos de trabajo MapReducee integrarlos para que funcionen como un único trabajo MapReduce.

9. Bibliografía

Guía de Instalación de Cloudera http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-High-Availability-Guide/CDH4-High-Availability-Guide.html

Blog de Cloudera, Eclipse con MapReduce http://blog.cloudera.com/blog/2013/08/how-to-use-eclipse-with-mapreduce-in-clouderas-quickstart-vm/

MapReduce Wordcount example http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html

Blog de Hadoopi http://hadoopi.wordpress.com/2013/05/25/setup-maven-project-for-hadoop-in-5mn/

Kite SDK (Cloudera Development Kit) http://kitesdk.org/docs/current/

WHITE, Tom. Hadoop: The Definitive Guide. O'Reilly. 2013

2 http://archive.cloudera.com/cdh4/cdh/4/oozie/WorkflowFunctionalSpec.html