O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
Informática como Servicio
Herramientas y ejemplos de trabajos
MapReduce con Apache Hadoop
David Albela Pérez
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.
Tabla de Contenidos
1.Introducción...........................................................................................
1. Introducción
En esta memoria se explica el desarrollo de una aplicación MapReduce con la versión de
Hadoop 0.20 a parti...
2. Requisitos previos
Antes de instalar Hadoop en un único nodo se deberá realizar la instalación de los paquetes
básicos....
3. Instalación en modo pseudo-distribuído
En este apartado se explica la instalación de Hadoop 0.20 en modo pseudo-distrib...
corruptos o caer algún DataNode. Si el NameNode cae no se puede acceder al sistema de
ficheros HDFS.
• Hadoop-hdfs-seconda...
$ sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-
hdfs/cache/mapred
6. Verificar la estructura del sistema de arc...
NOTA: El directorio output no debe existir.
4. Listar el resultado
$ hadoop fs -ls output
$ hadoop fs -cat output/part-000...
# Crear enlace simbólico del conector de MySQL en la ruta de configuración
de Sqoop.
$ sudo ln -s /usr/share/java/mysql-co...
$ sqoop import --connect jdbc:mysql://localhost/translator --table binary_files
--columns "id, filename, description" --fi...
4. Ver el contenido importado en HDFS.
$ hadoop fs -ls binary_files
$ hadoop fs -tail binary_texts/part-m-00000
En los fic...
# Si no se ha configurado la contraseña de root para MySQL
$ sudo /usr/bin/mysql_secure_installation
Con MySQL y el driver...
$ sudo vi /etc/hive/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhos...
$ sudo -u hdfs hdfs dfs -chmod 1777 /user/hive/warehouse
$ sudo -u hdfs hdfs dfs -ls /user/hive
Instalar e iniciar el serv...
hive> CREATE EXTERNAL TABLE translator (id_text INT, binary_file_id INT, english
STRING, spanish STRING, created TIMESTAMP...
También se pueden realizar consultas más complejas con JOIN, GROUP, ORDER, y condiciones
WHERE o HAVING.
6. Impala
Impala ...
Antes de instalar Impala es necesario tener el MetaStore local o compartido de Hive. Para la
instalación de esta memoria s...
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hadoop-hdfs/dn._PORT</value>
</property>
<property>
<name>d...
Si al ejecutar una consulta SQL se muestra el siguiente error es debido a que el catálogo de Impala
aún no se ha actualiza...
Los requisitos para la implementación son:
• Maven 3 or superior
• Oracle JDK o la versión openJDK 1.7
• Eclipse con el pl...
</profiles>
</settings>
3. Abrir Eclipse y crear un proyecto inicial.
• Ir a File -> New -> Project... y seleccionar Maven...
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>2.0.0-cdh4.0...
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>...
• Aplicar los cambios pulsando en Apply y ejecutar el ejemplo pulsando en Run.
8. Durante la ejecución se muestra por pant...
El código fuente del ejemplo se puede descargar del repositorio de github en el siguiente enlace
https://github.com/3lm4dn...
Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop
Próximos SlideShares
Carregando em…5
×

Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

4.690 visualizações

Publicada em

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

Publicada em: Software

Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop

  1. 1. Informática como Servicio Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop David Albela Pérez
  2. 2. Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.
  3. 3. Tabla de Contenidos 1.Introducción.......................................................................................................................................4 2.Requisitos previos.............................................................................................................................5 2.1.Instalación de JDK.....................................................................................................................5 2.2.Añadir repositorio de Cloudera..................................................................................................5 3.Instalación en modo pseudo-distribuído............................................................................................6 3.1.Instalación en Debian 7 o superior............................................................................................6 3.2.Configuración............................................................................................................................7 3.3.Probar MapReduce....................................................................................................................8 4.Sqoop.................................................................................................................................................9 4.1.Instalación de Sqoop..................................................................................................................9 4.2.Importar la Base de Datos........................................................................................................10 5.Hive.................................................................................................................................................12 5.1.Instalación de Hive..................................................................................................................12 5.2.Ejemplo en Hive......................................................................................................................15 6.Impala..............................................................................................................................................17 6.1.Instalación................................................................................................................................17 6.2.Configuración..........................................................................................................................18 6.3.Ejemplo con Impala.................................................................................................................19 7.MapReduce con Eclipse..................................................................................................................20 8.Múltiples Mappers...........................................................................................................................26 9.Bibliografía......................................................................................................................................26
  4. 4. 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/
  5. 5. 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
  6. 6. 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á de distribuír los trabajos enviados por el cliente a los distintos TraskTrackers. Normalmente se ejecuta en el nodo maestro denominado NameNode. Este paquete no incluye JobTracker en modo de alta disponibilidad (HA). • hadoop-0.20-mapreduce-tasktracker: Servicio TaskTracker. Este demonio se encarga de ejecutar 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. Cada DataNode se encarga de almacenar un conjunto de bloques de HDFS así como un checksum para validar que no está corrupto. Un nodo maestro o NameNode puede ser también DataNode. • Hadoop-hdfs-namenode: Servicio NameNode. Se instala en el nodo maestro. Se encarga de gestionar la metainformación de los ficheros almacenados en HDFS así como guardar un registro de los bloques que contiene cada fichero y en que DataNodes están. Cuando se guarda un bloque automáticamente se almacenan 3 réplicas en diferentes DataNodes. El NameNode también se encarga de solicitar nuevas réplicas en caso de encontrarse bloques
  7. 7. corruptos o caer algún DataNode. Si el NameNode cae no se puede acceder al sistema de ficheros HDFS. • Hadoop-hdfs-secondarynamenodelib: Servicio SecondaryNameNode se trata de un NameNode secundario que libera de carga para la actualización del registro de bloques- archivo del NameNode principal. Este NameNode secundario no provee de alta disponibildad 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ón yarn-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
  8. 8. $ 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 de Hadoop. 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.]+'
  9. 9. 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 herramienta Squoop 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 JDBC de 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
  10. 10. # Crear enlace simbólico del conector de MySQL en la ruta de configuración de 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 puede importar una base de datos. A continuación se detallan los pasos de la importación de una base de datos 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 datos que 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
  11. 11. $ sqoop import --connect jdbc:mysql://localhost/translator --table binary_files --columns "id, filename, description" --fields-terminated-by 't' --username training --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 hasta superar los 1024 bytes. Cuando se realiza la ejecución de importación se lanza automáticamente un trabajo Map, sin la fase Reduce. 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 tabla importada. En la ruta del usuario del sistema operativo se crea una clase java con el nombre de la tabla importada que contiene el MapReduce.
  12. 12. 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 tipo Map. 5. Hive Hive fue desarrollado por el equipo de Facebook para realizar el análisis de gran canditadad de datos 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 metadatos de HDFS. Es decir, relacionar los datos que se encuentran en HDFS, por cada línea de un fichero o bloque 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 metadatos necesarios para las tablas y particiones de datos de Hive en una base de datos relacional. Para ello se 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
  13. 13. # 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 tablas en 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.
  14. 14. $ 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 Hadoop HDFS. # 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
  15. 15. $ 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 formato cualquier en HDFS. En este ejemplo se utilizarán los datos importados de la base de datos translator 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 la separación de cada campo. En el ejemplo, la primera columna hace referencia al campo english y la segunda la columna spanish. Ambas columnas están separadas por una tabulación (t). Los ficheros que comienzan por “_” se ignoran. Desde un terminal ejecutar hive y crear la tabla que relacionará los datos en HDFS. $ hive
  16. 16. hive> CREATE EXTERNAL TABLE translator (id_text INT, binary_file_id INT, english STRING, spanish STRING, created TIMESTAMP) ROW FORMAT DELIMITED FIELDS TERMINATED 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 pueden ejecutar 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;
  17. 17. También se pueden realizar consultas más complejas con JOIN, GROUP, ORDER, y condiciones WHERE o HAVING. 6. Impala Impala es una herramienta de código abierto creada por Cloudera que permite a los usuarios consultar 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 las consultas de Impala son significativamente más rápidos que en Hive, entre 10 o 50 veces más rápido. 6.1. Instalación Impala se instala desde un repositorio aparte del resto de aplicaciones. Para instalar Impala antes 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 contrib deb-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 no se 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
  18. 18. 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>
  19. 19. <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ñadir tambié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 no está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;
  20. 20. Si al ejecutar una consulta SQL se muestra el siguiente error es debido a que el catálogo de Impala aú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 repite la 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 los 30 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 otro programa. Sin embargo, hay algunas diferencias entre ejecutar un trabajo MapReduce en un clúster distribuído a como funciona en Eclipse. Cuando se ejecuta código MapReduce en Eclipse, Hadoop ejecuta un modo especial llamado LocalJobRunner bajo el cual todos los trabajos lanzados se ejecutan en single node.
  21. 21. 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 los siguientes 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 homedel usuario. $ 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/
  22. 22. </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 siguientes lí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>
  23. 23. </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>
  24. 24. <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 -> Update dependencies..., 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 de instalació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 y seleccionar “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"
  25. 25. • 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 la información del trabajo lanzado en modo single node. 9. El resultado está en el directorio indicado en los argumentos de ejecución.
  26. 26. El código fuente del ejemplo se puede descargar del repositorio de github en el siguiente enlace https://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 texto indicado 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 si se 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 frases traducidas, 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 bastante grande 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 del primer Mapper con el de la segunda entrada. 4. Un trabajo Reduce se encarga de seleccionar la mejor traducción de una lista de posibles traducciones obtenidas en base al umbral establecido. Para el tercer paso existe la herramienta Oozie 2 que permite definir de flujos de trabajo MapReduce e 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

×