Administración de Apache Hadoop a través de Cloudera
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Administración de Apache Hadoop a través de Cloudera

  • 773 views
Uploaded on

Trabajo optativo del Máster de Ingeniería Informática de la Universidad de A Coruña para la asignatura "Informática como Servicio" sobre la instalación, configuración y administración de un clúster......

Trabajo optativo del Máster de Ingeniería Informática de la Universidad de A Coruña para la asignatura "Informática como Servicio" sobre la instalación, configuración y administración de un clúster de Hadoop.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
773
On Slideshare
546
From Embeds
227
Number of Embeds
13

Actions

Shares
Downloads
34
Comments
0
Likes
0

Embeds 227

http://seguridadydesarrolloeinnovacion.blogspot.com.es 190
http://seguridadydesarrolloeinnovacion.blogspot.com 12
https://seguridadydesarrolloeinnovacion.blogspot.com 6
http://feedly.com 4
https://www.blogger.com 3
http://54.199.180.60 3
http://seguridadydesarrolloeinnovacion.blogspot.com.ar 2
http://192.168.6.56 2
http://seguridadydesarrolloeinnovacion.blogspot.com.br 1
http://hubot-clb-2081983768.ap-northeast-1.elb.amazonaws.com 1
http://translate.googleusercontent.com 1
http://seguridadydesarrolloeinnovacion.blogspot.fr 1
http://seguridadydesarrolloeinnovacion.blogspot.mx 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Informática como Servicio Administración de Apache Hadoop a través de Cloudera David Albela Pérez
  • 2. Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 3.0 España.
  • 3. Tabla de Contenidos 1.Introducción.......................................................................................................................................5 2.Requisitos previos.............................................................................................................................6 2.1.Instalación de Java Development Kit........................................................................................6 3.Añadir repositorio de Cloudera.........................................................................................................6 4.Instalación en modo pseudo-distribuído............................................................................................7 4.1.Instalación en Debian 7 o superior............................................................................................7 5.Componentes de Hadoop...................................................................................................................8 5.1.HDFS.........................................................................................................................................8 5.2.NameNode.................................................................................................................................9 5.3.Secundary NameNode.............................................................................................................10 5.4.JobTracker................................................................................................................................10 5.5.DataNode y TaskTracker.........................................................................................................10 6.Configuración en modo pseudodistribuído.....................................................................................10 6.1.1.Puertos de Interfaz Web de los Servicios de HDFS y MapReduce..................................12 7.MapReduce......................................................................................................................................12 7.1.Ejemplo Grep...........................................................................................................................13 7.2.Funcionamiento de MapReduce..............................................................................................14 7.3.Terminología de MapReduce...................................................................................................15 8.HBase..............................................................................................................................................15 8.1.Instalación................................................................................................................................15 8.2.Configuración de HBase..........................................................................................................16 8.2.1.DNS con Hbase................................................................................................................16 8.2.2.Utilizando el protocolo de tiempo de red (NTP ) con Hbase...........................................16 8.2.3.Ajuste de los límites de usuario para HBase....................................................................16 8.2.4.Configurar dfs.datanode.max.xcievers con Hbase...........................................................17 8.3.Activar Hbase en modo Pseudodistribuído..............................................................................17 8.3.1.Crear directorio en HDFS................................................................................................17 8.3.2.Instalación de servidores adicionales...............................................................................18 8.4.Ejemplo de HBASE.................................................................................................................18 9.Flume...............................................................................................................................................19 9.1.Funcionamiento de Flume.......................................................................................................19 9.2.Instalación y Configuración.....................................................................................................20 10.Sqoop.............................................................................................................................................21 10.1.Instalación y configuración de HBase REST y Apache Thrift..............................................22 10.1.1.Instalación de HBase REST...........................................................................................22 10.1.2.Instalación de HBase Thrift...........................................................................................22 10.2.Instalación de Sqoop..............................................................................................................23 10.3.Importar una Base de Datos...................................................................................................24 11.Hive................................................................................................................................................26 11.1.Instalación de Hive................................................................................................................27 11.2.Ejemplo en Hive....................................................................................................................30 12.Impala............................................................................................................................................32 12.1.Instalación de Impala.............................................................................................................32 12.2.Configuración de Impala.......................................................................................................34 12.3.Ejemplo de Impala.................................................................................................................35 13.Pig..................................................................................................................................................37 13.1.Instalación de Pig...................................................................................................................37
  • 4. 13.2.Ejemplo de Pig.......................................................................................................................38 14.Hue................................................................................................................................................40 14.1.Instalación de Hue.................................................................................................................40 15.Otras Herramientas para Hadoop..................................................................................................42 15.1.Oozie......................................................................................................................................42 15.2.Zookeeper..............................................................................................................................43 15.3.Whirr......................................................................................................................................44 15.4.Snappy...................................................................................................................................45 15.5.Mahout...................................................................................................................................45 15.6.Avro.......................................................................................................................................46 16.Clúster de Hadoop con Alta Disponibilidad..................................................................................46 16.1.Componentes.........................................................................................................................46 16.1.1.NameNode.....................................................................................................................46 16.1.2.SecundaryNamenode.....................................................................................................46 16.1.3.DataNode.......................................................................................................................47 16.1.4.JobTracker......................................................................................................................47 16.1.5.TaskTracker....................................................................................................................47 16.2.Instalación del clúster............................................................................................................47 16.2.1.Requisitos Mínimos.......................................................................................................47 16.2.2.Desinstalar Cloudera Manager.......................................................................................48 16.3.Crear un Clúster de Hadoop...................................................................................................49 16.3.1.Configuración de Red....................................................................................................50 16.3.2.Instalación de paquetes..................................................................................................52 16.3.3.Configuración.................................................................................................................52 16.4.Alta Disponibilidad del NameNode.......................................................................................56 16.4.1.Failover Automático.......................................................................................................57 16.5.Clúster de Hadoop con Alta Disponibilidad..........................................................................57 16.5.1.Instalación de paquetes..................................................................................................57 16.5.2.Configuración.................................................................................................................58 16.6.Alta Disponibilidad en el JobTracker....................................................................................65 16.7.MapReduce en el clúster........................................................................................................71 16.7.1.Wordcount......................................................................................................................71 17.Seguridad.......................................................................................................................................73 18.Bibliografía....................................................................................................................................74
  • 5. 1. Introducción En esta memoria se explica la instalación, configuración y administración de Hadoop versión 0.20 a partir de los repositorios de Cloudera, utilizando la última versión estable de Cloudera CDH4.5. Algunas de las características principales ofrecidas por esta versión son: • Soporte para Oracle JDK 1.7 • MapReduce versión 2.0 (MRv2 o Yarn) • MapReduce versión 1.0 (MRv1) Para más información http://www.cloudera.com/content/cloudera-content/cloudera- docs/CDH4/latest/
  • 6. 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 Java Development Kit 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 3. 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
  • 7. 3. Instalación desde CentOS • Descargar e instalar el paquete $ wget http://archive.cloudera.com/cdh4/one-click- install/redhat/5/x86_64/cloudera-cdh-4-0.x86_64.rpm $ sudo yum --nogpgcheck localinstall cloudera-cdh-4-0.x86_64.rpm • Añadir clave pública GPG $ sudo rpm --import http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY- cloudera 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. 4. Instalación en modo pseudo-distribuído En este apartado se explica la instalación de Hadoop 0.20 en modo pseudo-distribuído. Cloudera recomienda utilizar MapReduce versión 1 en entornos de producción ya que considera que MapReduce versión 2 o Yarn están todavía en una versión temprana y no estable. Apache Hadoop se puede instalar en 3 modos distintos: • Local (standalone): Configurado para ejecutarse en modo no distribuído, sin el sistema de ficheros HDFS y en un único proceso de Java. Útil para debug. Instalación por defecto. • Pseudo-Distribuído: El objetivo de este apartado es configurar esta opción para su ejecución en modo distribuído en un único nodo. Cada demonio de Hadoop ejecuta procesos de Java distintos. • Completamente Distribuído: Hadoop instalado en varios varios nodos. 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. 4.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.
  • 8. 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 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. 5. Componentes de Hadoop 5.1. HDFS Hadoop Data File System es el sistema de ficheros utilizado por Hadoop. Es gestionado por el nodo maestro o NameNode y los datos se almacenan en nodos esclavos, llamados DataNode. Cada fichero se divide en bloques de datos de 64 Mbytes por defecto. Es por eso que Hadoop está preparado para trabajar con gran candidad de datos.
  • 9. Los ficheros son de una única escritura. Una vez colocado en HDFS, el fichero no se puede modificar. La única opción es leerlo, modificarlo y resubirlo. Sin embargo, existe la opción APPEND para agregar más datos a un fichero. Por ejemplo, la base de datos NoSQL HBase utiliza esta opción para guardar sus tablas de datos en HDFS optimizando el tamaño de estas hasta ocupar el mínimo bloque. Los directorios en HDFS no tienen ningún bloque asignado, pero sí tienen metadatos como los permisos y propietarios. Aún así ocupan espacio. 5.2. NameNode El NameNode es el nodo maestro del clúster. Su función principal es guardar los metadatos: permisos, usuario, grupo, fecha de creación e información de los bloques. Los metadatos se guardan en disco en el fichero FSImage1 , el cual sirve de punto de respaldo o checkpoint. La información de los metadatos se almacena y actualiza solo en memoria, sin embargo los cambios son registados en disco en los ficheros edits. Si el NameNode cae, no se puede acceder al sistema de ficheros de Hadoop. Durante el arranque del NameNode se comprueba el estado de FSImage y el edit log. El NameNode guarda el nombre de los bloques asociados con cada fichero en disco, sin embargo la ubicación de los bloques se guarda en memoria en base al informe enviado por cada DataNode. Los bloques nunca son transferidos al NameNode, sino que este le dice al nodo con la réplica que la envíe a un tercer nodo. Cuando un cliente quiere leer un fichero, le pregunta al NameNode donde se encuetran los datos, devoliendo una lista ordenada de los DataNode y nombre de bloques. El NameNode necesita memoria suficiente para guardar los metadatos y mantener así el clúster. Por cada ítem se usan entre 100 y 200 bytes de memoria RAM, donde un ítem es: • Un fichero con sus permisos, usuario, grupo, fecha de creación, etc. • Un bloque de información por cada bloque de datos que el fichero ocupa. Por ejemplo, si se guarda un fichero de un Gbyte con tamño por bloque de 128 MB, son 8 bloques de datos. Es decir, el fichero ocupa en memoria del NameNode 9 ítems (8 ítems por los bloques más un ítem por el propio fichero) o 1350 bytes (si cada bloque ocupa 150 bytes). Es decir, para un PetaByte de datos (2^50 bytes) de ficheros de un Gbyte cada uno se necesitan 1350 MB de memoria más la necesaria para el sistema operativo y los procesos Java. En el caso de un petabyte de ficheros de 100 Mbytes la memoria necesaria para el NameNode es mucho mayor. 5.3. Secundary NameNode El Secundary NameNode no sustituye al NameNode en ningún momento, su función principal es liberar la carga del NameNode aplicando los últimos cambios en el FSImage a partir del fichero edits. En resumen, se encarga de realizar los checkpoints. Una ver actualizado FSImage lo envía al NameNode. Por defecto actualiza cada hora o cuando el FSImage crece más de 64 Mbytes. 1 http://archive.cloudera.com/cdh/3/hadoop/hdfs_user_guide.html
  • 10. 5.4. JobTracker Es el proceso encargado de gestionar los trabajos MapReduce. Sin el JobTracker no se pueden ejecutar trabajos MapReduce en el clúster. En caso de que un nodo TaskTracker falle una tarea Map intenta ejecutar la misma tarea en otro nodo del clúster. Realiza hasta cuatro intentos en distintos nodos por cada tarea antes de avisar del fallo de la tarea. El JobTracker recibe mensajes heartbeat enviados por los TraskTracker para saber si están disponibles y mantiene un registro del progreso de los trabajos lanzados en el clúster. 5.5. DataNode y TaskTracker El DataNode es el nodo encargado de almacenar los datos. El TaskTracker es el servicio encargado de ejecutar las tareas MapReduce en un nodo. Normalmente el DataNode y el TaskTracker se instalan en el mismo nodo para poder procesar bloques de datos locales, aunque es posible tener un nodo solo con el demonio del TaskTracker y recibir los datos de otro nodo. El DataNode y el TaskTracker envían mensajes heartbeats al NameNode y JobTracker respectivamente para indicar que están disponibles. El DataNode envía además, para informar al NameNode, los bloques de datos que tiene disponibles. Cada bloque de datos almacenado en el DataNode tiene asociado un fichero .meta con el checksum del bloque para así poder comprobar que el bloque no está corrupto. La manera ideal de almacenar los datos en los DataNode es utilizar varios discos sin RAID, de forma que los bloques de datos se puedan leer directamente de cada uno de los distos simultáneamente en las tareas Map. Para evitar pérdidas de información, se realiza un réplica de cada bloque por defecto en 3 DataNode. Por otra parte, los TaskTracker cuando terminan una tarea Map almacenan los datos de salida en el disco local para sen enviados posteriormente al TraskTracker que ejecuta la tarea Reduce (en la medida de lo posible se intentará lanzar siempre en el mismo nodo). 6. Configuración en modo pseudodistribuído 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.
  • 11. 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 $ 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
  • 12. $ sudo jps 8. Crear directorios de usuario $ sudo -u hdfs hadoop fs -mkdir /user/<user> $ sudo -u hdfs hadoop fs -chown <user> /user/<user> 6.1.1. Puertos de Interfaz Web de los Servicios de HDFS y MapReduce Una vez iniciados HDFS y MapReduce es posible acceder a las interfaces web de los distintos servicios. A continuación se describen los puertos abiertos y sus interfaces: • 50030: Puerto por defecto del JobTracker ejecutado en el NameNode o nodo maestro. Permite acceder a la información de los trabajos MapReduce. http://localhost:50030/jobtracker.jsp • 50060: Puerto por defecto del TaskTracker ejecutado en el DataNode o nodo esclavo. http://localhost:50060/tasktracker.js. • 50070: Puerto por defecto del NameNode principal. Permite acceder a la información del HDFS, ver donde están distribuídos los bloques de datos y su estado ademas de visualizar el estado de cada DataNode. • 50090: En el puerto 50090 se puede acceder a la interfaz web del SecundaryNamenode: http://localhost:50090/status.jsp
  • 13. 7. MapReduce Una vez creada la estructura necesaria para que los usuarios clientes puedan almacenar datos en HDFS y ejecutar tareas MapReduce se puede ejecutar un par de ejemplos incluídos por defecto en el repositorio de Hadoop. 7.1. Ejemplo Grep A continuación se probará el ejemplo para realizar búsquedas con expresiones regulares sobre ficheros en HDFS. 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.]+' NOTA: El directorio output no puede existir. 4. Compobar la ejecución desde el JobTracker Desde la url local en el puerto 50030, http://localhost:50030/, se puede comprobar el estado del JobTracker y todos los trabajos lanzados. Pulsando en el enlace sobre el jobid del trabajo lanzado se puede ver información detallada del mismo.
  • 14. En la ventana con información del trabajo lanzado se puede observar el número de tareas Map y Reduce lanzadas, tres y una respectivamente, el estado y porcentaje de tareas completadas. 5. Listar el resultado $ hadoop fs -ls output $ hadoop fs -cat output/part-00000 | head 7.2. Funcionamiento de MapReduce Cuando se ejectua un trabajo MapReduce, entre las fases de Map y Reduce se ejecuta una fase intermedia que incluye los procesos shuffle y short. Estes dos procesos se encargan de mezclar y reordenar los datos generados en cada tarea Map para que las tareas Reduce obtengan los pares clave-valor ordenados y agrupados. Los datos intermediarios generados, de la salida Map, se almacenan en el nodo local donde se generan. Por ejemplo, en el ejemplo clásico de WordCount las salidas Map generadas en la tarea de un nodo (the 1) (the, 1) (the, 1) serían reordenadas y agrupadas para la entrada de la tarea Reduce como (the, [1, 1, 1]). En resumen, una tarea Mapper procesa una única entrada, o bloque, de HDFS. Los datos intermediarios se escriben en el disco del nodo local. Durante la fase de shuffle & sort todos los valores asociadores se reordenan. Los datos intercambiados entre los nodos a través de la red del clúster se comprimen por defecto para evitar ocupar demasiado espacio. Se peude escoger algoritmos y niveles de compresión/ descompresión en la configuración de MapRecude, sin embargo a veces puede influir en función de con que tipo de ficheros se desee trabajar, por ejemplo, tratamiento de imágenes requiere un mayor coste computacional de compresión/descompresión con mucho menor ahora de espacio frente a tratamiento de archivos de texto.
  • 15. 7.3. Terminología de MapReduce Cuando se lanza un trabajo MapReduce entran en juego: • Job: Son los trabajos Mapper y Reducer con una lista de entradas. • Task: El la unidad de trabajo. Un Job está divido en varias tareas. • Client: Quien ejecuta los trabajos enviándolos al JobTracker. El JobTracker inicia el Job. Cada jobId se llama job_xxx_xx. El cliente calcula los "input splits" o bloques de entrada para cada trabajo. Por defecto, los input splits son los bloques de cada fichero. Cada tarea Map procesa un único "input split". Cada demonio con su identificador jps es una instancia de la Máquina Virtual de Java. Cada vez que el TaskTracker lanza un tarea se crea una nueva instancia de la JVM. Así se aisla el TraskTracker de fallos de código o bugs, en caso de fallo se vuelve a lanzar la tarea asignada hasta un número determinado de intentos. Las tareas Task envían heartbreats al TaskTracker para indicar que están disponibles y funcionales. Si un TackTracker está ejecutando 3 tareas, tenemos 3 JVM. Cada JVM envía heartbeats al TaskTracker. Si dejan de recibirse heartbeats, el TaskTracker mata la instacia JVM y notifica al JobTracker para que vuelva a lanzar la tarea en otro momento. Si una tarea falla cuatra veces el Job se para. 8. HBase Hbase es una base de datos NoSQL. Proporciona almacenamiento de tablas a gran escala para Hadoop utilizando HDFS. Cloudera recomienda siempre instalar HBase en un modo independiente antes de intentar ejecutarlo en un clúster de conjunto. Dado que Hbase almacena varias versiones de los registros almacenados en las tablas es necesario instalar además el cliente NTP para sincronizar la hora con el resto de DataNodes. 8.1. Instalación El paquete de cloudera hbase instala las dependencias necesarias. $ sudo apt-get install hbase Con el siguiente comando se puede comprobar las rutas donde se ha instalado Hbase. $ sudo dpkg -L hbase Una vez completada la instalación se pueden utilizar las librerías de Hbase ubicadas en /usr/lib/HBase/ y /usr/lib/HBase/lib/ para incluir en el CLASSPATH de programas escritos en Java
  • 16. para utilizar la base de datos. 8.2. Configuración de HBase En la ruta de configuración /etc/hbase/conf se encuentran los siguientes ficheros de configuración • hbase-env.sh: Definición de las variables de entorno necesarias para Hbase. • hbase-site.xml: Descripción de propiedades de Hbase. 8.2.1. DNS con Hbase HBase utiliza el nombre de localhost para informar de su dirección IP. Si la máquina tiene múltiples interfaces, HBase utiliza la interfaz del nombre del host principal. Si no es suficiente se puede establecer en el archivo hbase.regionserver.dns.interface en hbase-site.xml para indicar la interfaz principal. Para que funcione correctamente esta configuración requiere que la configuración del clúster sea constante y cada host tenga la misma configuración de la interfaz de red. Como alternativa se puede establecer hbase.regionserver.dns.nameserver en el archivo hbase-site.xml para elegir un servidor de nombres diferente al predeterminado para todo el sistema. 8.2.2. Utilizando el protocolo de tiempo de red (NTP ) con Hbase Los relojes de los nodos deben estar sincronizados. Es necesario tener el demonio NTP ejecutado en todos los nodos del clúster. Si usted está teniendo problemas de consulta de datos o las operaciones del clúster inusuales , verifique la hora del sistema. Para obtener más información sobre NTP , consulte el sitio NTP. Para más información consultar el servicio NTP en http://www.ntp.org/ 8.2.3. Ajuste de los límites de usuario para HBase Debido a que HBase es una base de datos que utiliza gran cantidad de archivos al mismo tiempo. La configuración por defecto de ulimit en sistemas Unix, 1024 archivos abiertos como máximo, es insuficiente. Cualquier cantidad significativa de carga dará lugar a fallos con exceptiones del tipo java.io.IOException (demasiados archivos abiertos). Es recomendable incrementar el número máximo de identificadores de archivo a más de 10.000. Esta configuración se realiza en el propio sistema operativo. Además es un error muy común aumentar el número de identificadores de archivo para un usuario en concreto cuando HBase se ejecuta con un usuario diferente. Por eso se aumentan los valores para los usuarios hdfs y hbase. $ sudo vi /etc/security/limits.conf hdfs - nofile 32768 hbase - nofile 32768 En sistemas basados en Debian añadir además la siguiente línea: $ sudo vi /etc/pam.d/common-session session required pam_limits.so
  • 17. 8.2.4. Configurar dfs.datanode.max.xcievers con Hbase El parámetro de HDFS dfs.datanode.max.xciervers indica a los DataNode el límite superior del número de ficheros que puede servir al mismo tiempo. El valor recomendado es de 4096. Para efectuar los cambios se debe reiniciar HDFS. $ sudo vi /etc/hadoop/conf/hdfs-site.xml # Añadir al final del fichero “:$” <property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property> # Reiniciar HDFS $ for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x restart ; done 8.3. Activar Hbase en modo Pseudodistribuído Para activar Hbase en modo pseudodistribuído se debe indicar en el archivo de configuración hbase-site.xml el hostname del nodo NameNode de HDFS, descrito en la propiedad fs.defaultFS del fichero de configuración de Hadoop core-site.xml. En el ejemplo se utiliza el host local hdfs://localhost:8020 $ sudo vi /etc/hbase/conf/hbase-site.xml <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:8020/hbase</value> </property> 8.3.1. Crear directorio en HDFS Antes de iniciar el nodo maestro de HBase es necesario crear el directorio en HDFS. El nodo maestro se ejecuta como el usuario hbase por tanto también hay que asignarle los permisos necesarios. Con HDFS en ejecución. $ sudo -u hdfs hadoop fs -mkdir /hbase $ sudo -u hdfs hadoop fs -chown hbase /hbase $ sudo -u hdfs hadoop fs -ls / | grep hbase
  • 18. 8.3.2. Instalación de servidores adicionales Una vez configurado se necesita instalar los servidores que forman un clúster de HBase en modo distribuído o distribuído: • ZooKeeper: Proporciona un servicio centralizado de alta disponibilidad para la gestión del clúster. Permite a los clientes localizar los servidores o asegurar que un solo maestro esté activo a la vez. Para un clúster pequeño se recomiendo instalar ZooKeeper en el NameNode. # Actualizar sistema e instalar cliente y servidor $ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install zookeeper-server # Nota: Versiones posteriores a Debian 6 squeeze podrían # tener problemas de dependencia con algún paquete. # Iniciar servicio $ sudo service zookeeper-server start • HBase Master: El servicio de nodo maestro para el cliente Hbase. $ sudo apt-get install hbase-master # Iniciar servicio $ sudo service hbase-master start • HBase RegionServer: Es la parte de Hbase que recibe los datos y procesa las solicitudes. Se ejecuta en todos los nodos esclavos pero no en el nodo maestro. $ sudo apt-get install hbase-regionserver # Iniciar servicio $ sudo service hbase-regionserver start Una vez iniciados los servicios adicionales, HBASE se encuentra disponible en modo pseudo- distribuído. Se pueden comprobar los procesos independientes de Java con el comando jps: $ sudo jps Deben aparecer los procesos HMaster, HregionServer y QuorumPeerMain. 8.4. Ejemplo de HBASE Se puede acceder a HBASE a través del cliente Shell instalado por defecto en el paquete hbase. $ hbase shell A continuación se detallan los pasos de creación de una tabla con el cliente shell de HBase. # Crear tabla test con columna data
  • 19. create 'test', 'data' # Verificar la tabla creada list 'test' #Insertar filas put 'test', 'row1', 'data:1', 'value1' put 'test', 'row2', 'data:2', 'value2' put 'test', 'row3', 'data:3', 'value3' # Verificar datos en tabla scan 'test' # Obtener el dato de una fila get 'test', 'row1' # Eliminar tabla disable 'test' drop 'test' 9. Flume Apache Flume es un servicio que permite distribuír y mover gran cantidad de ficheros log de distintas fuentes origen a un sistema de almacenamiento distribuído de forma eficiente. 9.1. Funcionamiento de Flume Flume funciona como un servicio de transporte de información de logs de servidores a través distintos agentes para almacenar la información y enviarla posteriormente a un clúster de Hadoop. En la figura del ejemplo, un agente se encarga de obtener la información enviada por el servidor web a través de la rotación de logs en Unix con el proceso rsyslog y el agente se encarga de enviar la información de distintos logs serializada a HDFS. Flume soporta encriptación y compresión de los datos transferidos. En caso de que el agente caiga, los logs enviados por el servidor se mantienen en el origen o source. Los datos se suelen
  • 20. guardar en el agente hasta alcanzar un tamaño máximo para así optimizar el uso de los bloques de HDFS, por defecto 64 Mbytes aunque se suele configurar con 128 Mbytes por bloque. Para enviar los datos a HDFS, además se Sink se suele utilizar Apache Avro para serializar los datos en la transferencia entre agentes sin perder el formato. Es posible definir varios agentes flume y un recolector. En este caso se suele utilizar Avro para serializar los datos y no perder el formato. De esta manera se realiza un reparto eficiente de los distintos logs de varios servidores en varios agentes. El recolegor de flume se encarga de recoger la información recogida y serializada para transferirla a HDFS. 9.2. Instalación y Configuración A continuación se detallan los pasos para realizar la instalación de Flume. $ sudo apt-get install flume-ng Para instalar el agente de Flume e iniciar automáticamente Flume en el inicio del sistema operativo. $ sudo apt-get install flume-ng-agent Para instalar la documentación de Flume. $ sudo apt-get install flume-ng-doc Para la configuración Se incluye una plantilla de configuración base en /etc/flume-ng/conf/flume- conf.properties.template y en /etc/flume-ng/conf/flume-env.sh.template. Copiar los ficheros plantilla a la configuración de Flume. $ sudo cp /etc/flume-ng/conf/flume-conf.properties.template conf/flume.conf En flume.conf se definen las propiedades que determinan las fuentes (sources) de datos que recompilar, sinks o canales Avro donde de flujo del agente. Por defecto estas propiedades están configuradas para trabajar con una única fuente de datos, un logger sink y un único canal de memoria.
  • 21. Opcionalmente se pueden determinar variables de entorno para flume-env.sh. El ejecutable flume-ng utiliza el fichero flume-env.sh para ejecutar las variables de entorno que especifiquen opciones del agente ejecutado en un proceso Java como aumentar el tamaño del heap por defecto u opciones de depuración vía JAVA_OPTS para el desarrollo de componentes de Flume-ng. $ sudo cp /etc/flume-ng/conf/flume-env.sh.template conf/flume-env.sh Verificar la instalación de flume $ flume-ng help Ejecutar el agente Flume-ng $ sudo service flume-ng-agent start También se pueden definir el fichero de configuración con el comando flume-ng. $ /usr/bin/flume-ng agent -c <config-dir> -f <config-file> -n <agent-name> Donde -c indica la ruta de configuración, -f el fichero y n el nombre del agente. Por ejemplo: $ /usr/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf -n agent 10. Sqoop Apache Sqoop es una herramienta de integración de datos en HDFS a partir de fuentes de orígenes de bases de datos relacionales. Permite importar o exportar una base de datos en HDFS. Para realizar las tareas requiere de la instalación del driver JDBC del gestor de bases de datos, el driver está incluído por los diferentes fabricantes y no se encuentra en el paquete de Sqoop. Soporta varios gestores: • MySQL • Oracle • Netezza • Microsoft SQL Server • Teradata Sqoop se encarga de examinar las tablas de la BD y generar clases Java de forma automática. Existen dos versiones disponibles de Sqoop en los repositorios de Cloudera: • Sqoop: Importación/Exportación de Bds a través del drive JDBC del fabricante. Incluye las funcionalidades descritas anteriormente. Se trata de un programa cliente que accede a la base de datos relacional y a Hadoop. • Sqoop2: Permite la instalación de Sqoop como un servicio. De este modo se puede utilizar Sqoop desde varios hosts sin necesidad de instalar todos los drivers JDBC y el cliente de Sqoop en todos los hosts. Añade una interfaz web y servicio REST a través de dos interfaces:
  • 22. ◦ WebHDFS: No soporta HDFS con alta disponibilidad o HA. ◦ Http FS: Opción recomendada, soporta HA. Ambas interfaces soportan lectura/escritura sobre HDFS. Puede ser accesible desde un script, requiere un cliente con acceso a los DataNodes en el clúster. Para utilizar los servicios REST en Sqoop2 se requiere habilitarlos en la configuración de HDFS, en el fichero hdfs-site.xml. $ sudo vi /etc/hadoop/conf/hdfs-site.xml <propertie>dfs.webhdfs.enable</propertie> <value>yes</value> Se puede acceder por interfaz web al servicio rest webhdfs a través de la url: http://localhost:5007/webhdfs/ 10.1. Instalación y configuración de HBase REST y Apache Thrift Para acceder a una base de datos HBase existen los paquetes de HBase Rest y Thrift, APIS para utilizar HBase a través del servicio web REST y Thrift en lugar de utilizar un driver JDBC específico para la base de datos. 10.1.1. Instalación de HBase REST. Para la instalación del paquete base de HBase REST ejecutar en terminal el siguiente comando. $ sudo apt-get install hbase-rest # Iniciar el servicio $ sudo service hbase-rest start El script de inicio de Hbase utilizar por defecto el puerto 8080. Es posible cambiar el puerto en caso de conflicto con otras aplicaciones ejecutadas en el mismo host, por ejemplo jetty o tomcat. Para modificar el puerto añadir en hbase-site.xml: $ vi /etc/hbase/conf/hbase-site.xml <property> <name>hbase.rest.port</name> <value>60050</value> </property> También se puede utilizar la variable de entorno HBASE_REST_OPTS para pasar otros parámetros en hbase-env.sh al servicio REST de JVM. 10.1.2. Instalación de HBase Thrift El servicio de HBase Thrift es una alternativa para acceder e interactuar con HBASE independientemente del lenguaje utilizado. El servicio Thrift es multiplataforma y más eficiente que REST en muchos casos. No debería de ser instalado en el mismo nodo donde está el NameNode y JobTracker.
  • 23. La instalación se realizar a través de los siguientes pasos: $ sudo apt-get install hbase-thrift $ sudo service hbase-thrift start Para más información sobre el servicio Thrift visitar la página http://incubator.apache.org/thrift/ 10.2. 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 # 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/
  • 24. 10.3. Importar una 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 $ 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.
  • 25. 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. 4. Ver el contenido importado en HDFS. $ hadoop fs -ls binary_files $ hadoop fs -tail binary_texts/part-m-00000
  • 26. En los ficheros part-m-xxxxx estan los datos importados. La m indica que son salidas de tareas tipo Map. 11. Hive Hive fue desarrollado por el equipo de Facebook para realizar el análisis de gran canditada de datos lanzando trabajos MapReduce automáticamente a través de sentencias SQL. Hive traduce consultas de SQL en trabajos MapReduce. Para su funcionamiento convierte las consultas SQL en HiveQL y de este formato autogenera clases java para ejecutar trabajos MapReduce. No permite operaciones de modificación como update o delete, pero sí se pueden realizar inserts. Requiere de una Metastore donde se guarda la relación de los datos con los que se quiere trabajar indicando sus columnas, nombre y separadores. Para ello utiliza una base de datos relaciones en MySQL. Para comunicarse con la base de datos necesita el drive JDBC. La Metastore puede ser configurada de varios modo para un usuario local o ser compartida por todos los usuarios con acceso. • Embedded Mode: Todo en un único proceso. Implementación por defecto. Utiliza una base de datos Apache Derby, la ejecución del MetaStore y la base de datos están dentro del proceso de Hive. Solo admite un usuario activo en cada ejecución. No se aconseja su uso en producción. • MetaStore Local: El proceso de MetaStore se ejecuta en el mismo proceso que el de HiveServer pero la base de datos se ejecuta en un proceso separado y puede estar en un host separado. La comunicación se realiza a través de JDBC. Soporta varios gestores de bases de datos como Oracle, MySQL o PostgreSQL. • MetaStore Compartido o Remoto: MetaStore ejecuta su propip proceso de JVM. HiveServer, Impala y otros servicios se comunican con él a través de la API de red Thrift. El servicio de MetaStore se comunica con la base de datos a través de JDBC. Si múltiples usuarios ejecutan Hive, se debe configurar en modo compartido. Existe la versión Hive2 que funciona como servicio además de como cliente. Se trata de un servidor donde los clientes acceden al servidor Hive2. Los clientes no se conectan directamente al MetaStore ni al cluster de Hadoop aportando mayor segudad por restricción de acceso directo al MetaStrore y
  • 27. al clúster y tiene una configuración más sencilla. Soporta ODBC para conectarse al MetaStore además de JDBC. Hive2 soporta Thrift para comunicarse con los clientes. 11.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 # 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;
  • 28. También es necesario crear una cuenta de usuario con acceso a la base de datos MySQL para acceder a la MetaStore. Es muy 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. $ 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>
  • 29. <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 $ 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;
  • 30. 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 11.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 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.
  • 31. 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; También se pueden realizar consultas más complejas con JOIN, GROUP, ORDER, y condiciones WHERE o HAVING.
  • 32. 12. 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 de 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. Tiene sus propios demonios y se componente de los siguientes elementos: • Clientes: donde se ejecutan las consultas. Impala Shell • Hive MetaStore: información almacenda relacionada con los datos que se analizan. • Cloudera Impala: proceso ejecutado en los DataNodes que coordina y ejecuta las consultas. Cada instancia de Impala puede recibir, planificar y coordinar consultas solicitadas desde los clientes. • HBase y HDFS: donde se almacenan los datos a analizar. Incluye soporte para los principales gestores de bases de datos a través de sus drivers JDBC. También soporta ODBC. 12.1. Instalación de Impala 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.
  • 33. 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 Por último, Impala no debe ser ejecutado con el usuario root ya que este no tiene permitido las lecturas directas, afectando negativamente en el rendimiento de Impala. 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 Impala tiene sus propios procesos en ejecución: • impalad: demonio de Impala. Planifica y ejecuta las consultas contra HDFS o Hbase. Ejecuta un proceso demonio en cada nodo del clúster que sea DataNode. • statestored: Maestro que monitoriza las instancias de Impala en los DataNode. Ejecuta una instancia de este demonio en el nodo del clúster donde está instalado. • catalogd: Servicio de coordinación de los metadatos que envia cambios DDL y DML a todos
  • 34. los nodos, de esta forma nuevas tablas o carga de nuevos datos son visibles inmediatamente por las consultas a través de los nodos de Impala. • impala-shell: Interfaz de línea de comandos para ejecutar las consultas. 12.2. Configuración de Impala 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> <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
  • 35. 12.3. Ejemplo de Impala En /etc/default/impala añadir los siguientes parámetros de configuración $ sudo vi /etc/default/impala # El nombre del host que ejecuta la instancia de Impala State Store (impala- state-store) IMPALA_STATE_STORE_HOST=localhost # Limitar la memoria utilizada por las consultas de Impala en los DataNode al 50% de la memoria disponible con -mem_limit. # Añadir la última línea con la barra invertida en la anterior. IMPALA_SERVER_ARGS=" -log_dir=${IMPALA_LOG_DIR} -state_store_port=${IMPALA_STATE_STORE_PORT} -use_statestore -state_store_host=${IMPALA_STATE_STORE_HOST} -be_port=${IMPALA_BACKEND_PORT} -mem_limit=50%" 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 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 Revisar los logs de Impala y los procesos de JVM $ sudo tail /var/log/impala/impala-server.log $ sudo tail /var/log/impala/impala-state-store.log $ ps aux | grep impala
  • 36. En la dirección http://localhost:25000/ se puede acceder a la interfaz web de Impala Server donde localhost es el hostname donde está instalado. 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; 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;
  • 37. 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. 13. Pig Al igual que Hive o Impala, Pig es otra herramienta de análisis de gran cantidad de datos a través de consultas. La diferencia es que no utiliza sentencias SQL sino que tiene su propio lenguaje. Inicialmente desarrollado por Yahoo! y liberado para la Apache Software Fundation. Utiliza un lenguaje de control de flujo llamado Pig Latin que permite realizar consultas en un clúster distribuído de Hadoop. Se supone que el lenguaje es más sencillo y facilita realizar análisis de datos a personas que no conocen la sintaxis de SQL. Se trabaja con datos estructurados donde se definen bolsas en lugar de tablas. Cada bolsa carga un conjunto de datos de HDFS. 13.1. Instalación de Pig Para instalar Pig ejecutar.
  • 38. $ sudo apt-get install pig Pig utiliza automáticamente la configuración activa de Hadoop. Una vez instalado, se puede utilizar el cliente Grunt Shell. Opcionalmente se puede configuran las variables de entorno de Pig indicando la ruta de librerías de HBase o Zookeeper separadas por dos puntos. $ export PIG_CONF_DIR=/usr/lib/pig/conf $ export PIG_CLASSPATH=/usr/lib/hbase/hbase-0.94.6-cdh4.5.0- security.jar:/usr/lib/zookeeper/zookeeper-3.4.5-cdh4.4.0.jar 13.2. Ejemplo de Pig Para realizar el ejemplo de Pig se utilizan dos tablas de la base de datos translator de MySQL. La tabla binary_files contiene el registros de nombres de ficheros, la tabla binary_texts contiene textos en inglés con su traducción al español. Cada registro de binary_texts pertenece a un registro de binary_files y su relación se establece con la columna binary_files_id. Con los datos previamente almacenados en HDFS en la sección de Scoop, iniciar la shell grunt de Pig. $ pig grunt> ls Cargar los datos de los ficheros en bolsas texts y files. grunt> texts = LOAD 'binary_texts' AS (id_text:int, binary_file_id:int, english:chararray, spanish:chararray, create_date:chararray); grunt> files = LOAD 'binary_files' AS (id_file:int, file:chararray, desc:chararray); A contuación se crea una tercera bolsa con los datos de ambas tablas relacionados. grunt> jnd = JOIN files BY id_file, texts BY binary_file_id; Finalmente, se crean los filtros de búsqueda y se guarda el resultado en una ubicación. grunt> filtro = FILTER jnd BY id_text == 5; grunt> STORE filtro INTO 'pigout1'; Cuando se ejecuta la orden STORE se lanza un trabajo MapReduce.
  • 39. El resultado de la consulta se almacena en el directorio indicado pigout1. En el resultado se muestran todos los datos de la línea encontrada en binary_texts con el identificador 5 y los datos de la línas del registro asociado en binary_files. Para contar el número de registros se utiliza la sentencia GROUP. grunt> texts = LOAD 'binary_texts' AS (id_text:int, binary_file_id:int, english:chararray, spanish:chararray, create_date:chararray); grunt> texts_group = GROUP texts ALL; grunt> texts_count = FOREACH texts_group GENERATE COUNT(texts); grunt> STORE texts_count INTO 'pigout2'; El resultado se almacena en la ruta indicada pigout2. La ventaja de Pig frente a Impala y Hive es que los datos referenciados pueden contener saltos de línea sin que afecte al resultado. En las pruebas realizadas con las tres herramientas, Hive e Impala obtenian resultados distintos cuando los datos importados tenían saltos de líneas provocando que un registro se almacenase en más de una línea en los ficheros. En cambio Pig obtenía los resultados
  • 40. correctos y realizaba perfectamente la comparación where con los campos correspondientes a pesar de los saltos de línea. Como desventaja, requiere por parte del usuario el aprendizaje del lenguaje Pig Latin. Además, los datos no se muestran en pantalla de grunt, sino que almacenan en directorios salida de HDFS. 14. Hue Hue Server es un contenedor web de aplicaciones de Hadoop que permite gestionar y administrar los servicios de diferentes aplicaciones a través de su interfaz web. El nodo con Hue instalado se comunica con los diferentes servicios del clúster de Hadoo. Hace más cómodo el uso de las herramientas de Hadoop para los usuarios mediante un navegador y permite restringir acceso al clúster desde la interfaz web a través de usuarios y grupos. También incluye soporte para control de acceso a través de bases de datos (por defecto SQLite3) y LDAP. Incluye las siguientes opciones de navegación: • Hive UI. Permite acceder al shell de Hive. Para su uso se requier añadir los ficheros de configuración de Hive en los de Hue. • Impala UI: Permite acceder al shell de Impala. Para su uso se requier añadir los ficheros de configuración de Impala en los de Hue. • File Browser: Permite acceder a los datos en HDFS. Para ello es necesario activar el servicio REST bien con el protocolo webHDFS o HttpFS en la configuración de HDFS. • Job Browser: Permite navegar por los trabajos lanzados al JobTracker. Requiere instalar los plugins de Hue en el JobTracker. • Job Designer • Oozie WorkFlow Editor • Shell UI 14.1. Instalación de Hue Para su instalación ejecutar la siguiente línea en un terminal de uno de los nodos. $ sudo apt-get install hue Para el acceso a HDFS a través del HDFS Browser instalar uno de los dos servicios REST. • Para webHDFS (no incluye soporte de NameNode alta disponibilidad o HA)
  • 41. $ sudo vi /etc/hadoop/conf/hdfs-site.xml <propertie>dfs.webhdfs.enable</propertie> <value>yes</value> $ sudo service hadoop-hdfs-namenode restart • Para HttpFS (incluye soporte para HA) $ sudo apt-get install hadoop-httpfs $ sudo service hadoop-httpfs start # Editar permisos de acceso a HttpFS $ sudo vi /etc/hadoop/conf/core-site.xml <property> <name>hadoop.proxyuser.httpfs.hosts</name> <value>monkey</value> </property> <property> <name>hadoop.proxyuser.httpfs.groups</name> <value>*</value> </property> # Comprobar acceso a la API curl -s "http://localhost:14000/webhdfs/v1? op=GETHOMEDIRECTORY&user.name=keri" | python -m json.tool $ sudo service hadoop-hdfs-namenode restart Para más información sobre la instalación de HttpFS ir la url https://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation- Guide/cdh4ig_topic_25_5.html A continuación se definen los parámetros de configuración en la ruta /etc/hue/hue.ini. $ sudo vi /etc/hue/hue.ini webhdfs_url=http://localhost:14000/webhdfs/v1/ jobtracker_host=localhost server_host=localhost Para utilizar Hive UI e Impala UI es necesario añadir los ficheros de configuración de ambos servicios en la configuración de Hue. $ sudo cp /etc/hive/conf/hive-site.xml /etc/hive/conf $ sudo service hue start Copiar los plugins de JobTracker de Hue al JobTracker $ sudo cp /usr/share/hue/desktop/libs/hadoop/java-lib/hue-plugins* /usr/lib/hadoop-0.20-mapreduce/lib/ # Configurar los plugins añadidos en el JobTracker
  • 42. $ sudo vi /etc/hadoop/conf/mapred-site.xml <property> <name>jobtracker.thrift.address</name> <value>localhost:9290</value> </property> <property> <name>mapred.jobtracker.plugins</name> <value>org.apache.hadoop.thriftfs.ThriftJobTrackerPlugin</value> </property> # Reiniciar el JobTracker $ sudo service hadoop-0.20-mapreduce-jobtracker restart # Reiniciar los TaskTrackers $ sudo service hadoop-0.20-mapreduce-tasktracker restart Crear el usuario con acceso a la interfaz de Hue. $ sudo /usr/sbin/useradd hue_admin Acceder a la interfaz ir a http://localhost:8888 e introducir la contraseña del usuario hue_admin indicada en el paso anterior. NOTA: En modo distribuído con varios clústers sustituír “localhost” por en hostname del nodo donde están instalados los diferentes servicios JobTracker, TaskTracker, MetaStore, Hive, Impala y Hue. 15. Otras Herramientas para Hadoop 15.1. Oozie El planificador Oozie es una herramienta para el diseño y la planificación de flujos de trabajo. Gestiona y coordina trabajos de Apache Hadoop. Oozie se compone de tres componentes principales: • Oozie Workflow: los trabajos de Oozie Workflow se planifican mediante acciones definidas en grafos DAG (Directed Acyclical Graphs). • Ooozie Coordinator: el coordinador de Oozie lanza estos trabajos según cada unidad tiempo y la disponibilidad de los datos. • Oozie Bundle: Agrupación de un conjunto de trabajos que son gestionados como un único trabajo. En resumen Oozie es un servicio extensible, escalable y contenedor de datos que permite harmonizar dependencias de varios trabajos ejecutados en Hadoop como un único trabajo MapReduce. Para instalar Oozie se necesitan los paquete del servicio y el cliente: $ sudo apt-get install oozie $ sudo apt-get install oozie-client
  • 43. Por defecto está configurado para MapReduce v1 con la variable de entorno CATALINA_BASE=/usr/lib/oozie/oozie-server-0.20 definida en el fichero /etc/oozie/conf/oozie- env.sh. Para utilizar Oozie con YARN (MapReduce v2) cambiar el valor de la variable por /usr/lib/oozie/oozie-server-0.20. Por defecto utiliza la base de datos Derby. Pero se puede utilizar otro gestor, para como Oracle, MySQL o PostgreSQL. Cloudera recomienda utilizar una de estas base de datos que Derby es una base de datos embebida que no permite monitorizar su estado de salud. Para configurar la base de datos añadir las propiedades en /etc/oozie/conf/oozie-site.xml. $ sudo vi /etc/oozie/conf/oozie-site.xml <property> <name>oozie.service.JPAService.jdbc.driver</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>oozie.service.JPAService.jdbc.url</name> <value>jdbc:mysql://localhost:3306/oozie</value> </property> <property> <name>oozie.service.JPAService.jdbc.username</name> <value>oozie</value> </property> <property> <name>oozie.service.JPAService.jdbc.password</name> <value>password</value> </property> 15.2. Zookeeper Zookeeper es un servicio centralizado para el mantenimiento de la información de configuraciones, nombres y sincronización de servicios disponibles. Al igual el resto de aplicaciones para Hadoo, es una herramienta de código abierto a cargo de Apache Software Fundation. Como su nombre indica, cuidador del zoo, se encarga de gestionar la fauna de Hadoop. Todos los servicios se utilizan a través de aplicaciones distribuídas y cada vez que se implementan hay muchas tareas y trabajos que realizar para su configuración y funcionamiento que terminan en problemas con corrección de errores y fallos. Zookeeper se compone de dos paquetes. • Zookeeper base: bibliotecas básicas y scripts necesarios para ejecutar un servidor Zookeeper y sus clientes. • Zookeeper Server: Contiene los scripts de inicio del servicio necesarios para ejecutar Zookeeper como un proceso demonio. Depende de zookeeper, su instalación incluye el paquete básico. Para su instalación ejecutar las siguientes lineas en un terminal. $ sudo apt-get install zookeeper $ sudo apt-get install zookeeper-server
  • 44. 15.3. Whirr Es un conjunto de bibliotecas para ejecutar Hadoop en servicios Cloud. Se puede usar en clústers como Amazon EC2 sin necesidad de instalar los paquetes de Hadoop ni realizar configuración alguna, tan solo se necesita ejecutar los comandos de Whirr. Es ideal para crear y ejecutar clusters de Hadoop como prueba de concepto para ejecutar unos pocos trabajos MapReduce. Cuando terminen los trabajos se puede eliminar el clúster de Hadoop y todos los datos generados con un comando. Para instalar el cliente Whirr ejecutar. $ sudo apt-get install whirr # Verificar la versión $ whirr version # Generar par de clave SSH ssh-keygen -t rsa -P '' Una vez instalado Whirr se procede a definir un cluster de Hadoop con MapReduce v1. $ vim hadoop.properties whirr.cluster-name=myhadoopcluster whirr.instance-templates=1 hadoop-jobtracker+hadoop-namenode,1 hadoop- datanode+hadoop-tasktracker whirr.provider=aws-ec2 whirr.identity=<cloud-provider-identity> whirr.credential=<cloud-provider-credential> whirr.private-key-file=${sys:user.home}/.ssh/id_rsa whirr.public-key-file=${sys:user.home}/.ssh/id_rsa.pub whirr.env.repo=cdh4 whirr.hadoop-install-function=install_cdh_hadoop whirr.hadoop-configure-function=configure_cdh_hadoop whirr.hardware-id=m1.large whirr.image-id=us-east-1/ami-ccb35ea5 whirr.location-id=us-east-1 Con esta configuración se crean dos instancias en AWS, una instancia es el NameNode con su JobTracker. Lanzar el clúster de Hadoop a través de la configuración definida. $ whirr launch-cluster --config hadoop.properties Este comando lanza un clúster definido en hadoop.properties y genera una carpeta oculta en la ruta del usario del sistema con el nombre del valor definido en la propiedad whirr.cluster-name. Ejecutar un proxy para conectarse al clúster. Abre un túnel SSH a través del puerto 6666. $ . ~/.whirr/<cluster-name>/hadoop-proxy.sh Para terminar el proxy pulsar Ctrl + C. Después de crear un clúster de Hadoop se crea automáticamente el fichero hadoop-site.xml en el directorio ~/.whirr/<cluster-name>. Para lanzar un trabajo MapReduce: $ export HADOOP_MAPRED_HOME=/usr/lib/hadoop-0.20-mapreduce
  • 45. $ hadoop fs -mkdir input $ hadoop fs -put $HADOOP_MAPRED_HOME/CHANGES.txt input $ hadoop jar $HADOOP_MAPRED_HOME/hadoop-examples.jar wordcount input output $ hadoop fs -cat output/part-* | head Para destruír el clúster creado. $ whirr destroy-cluster --config hadoop.properties # y finalizar el proxy de whirr. 15.4. Snappy Es una biblioteca para compresión/descompresión de datos. Su uso está orientado para la obtener porcentajes razonables de compresión en poco tiempo y su máxima compresión con compatibilidad con otras bibliotecas de compresión. Se utiliza en trabajos MapReduce, Pig, Hive, importación con Sqoop y con la base de datos HBase. En el caso de MapReduce se utiliza como compresión/descompresión de los datos intermediarios de la fase shuffle & order haciendo la ejecución de trabajos más rápida gracías a la rapidez de compresión/descompresión comparado con otros formatos como Gzip. Por defecto viene instalado con los paquetes básicos de Hadoop. Para activar la compresión snappy añadir en la configuración de mapred-site.xml en MapReduce v1. $ sudo vi /etc/hadoop/conf/mapred-site.xml <property> <name>mapred.compress.map.output</name> <value>true</value> </property> <property> <name>mapred.map.output.compression.codec</name> <value>org.apache.hadoop.io.compress.SnappyCodec</value> </property> 15.5. Mahout Apache Mahout es una herramienta para Machine-Learning2 para construir conjuntos de datos razonablemente grandes a partir de librerías de aprendizaje. La traducción de la palabra Mahout significa la persona que conoce y maneja a un elefante. La mascota de Hadoop es un elefante, en alusión al elefante de peluche de la hija de su creador, Doug Cutting. Mahout es la herramienta inteligente que utiliza Hadoop para obtener Mahout utiliza algorimots definidos para tareas de análisis de datos y minería tales como: • Recomendación en minería de datos: técnicas de recomendación de objetos. • Clustering: para descubrir estructuras en colección de datos. • Classification: técnica supervisada para encontrar relaciones y crear categorías. • Frecuencia de objetos: identificar los objetos de más usados dentro de un conjnto, por ejemplo artículos más comprados por usuarios. 2 Machine-Learning: Técnica para enseñar a los programas que deben hacer.
  • 46. Para instalar Mahout $ sudo apt-get install mahout $ sudo apt-get install mahout-doc Para más información sobre Mahout ir a la wiki de la función Apache en https://cwiki.apache.org/confluence/display/MAHOUT/Mahout+Wiki 15.6. Avro Avro es un sistema de serialización de datos. Soporta estructuras de datos, datos binarios y contenedor de ficheros ("Avro data files"). Su uso está pensado para el envío de datos entre aplicaciones o servicios escritos en distintos lenguajes de programación. Se suele utilizar en los agentes de Flume para la serialización de datos en HDFS que provienen de distintas fuentes. 16. Clúster de Hadoop con Alta Disponibilidad En esta sección se explica la instalación de un clúster de Hadoop con 4 nodos utilizando la alta disponibilidad (HA o High Avaliability) para el NameNode y el JobTracker. 16.1. Componentes A continuación se detallan los componentes del clúster y sus funcionalidades. 16.1.1. NameNode Un clúster de Hadoop utiliza el servicio NameNode o nodo maestro para mantener los metadatos de los ficheros de HDFS y las tripletas fichero-bloque-DataNode para localizar los bloques de los ficheros almacenados en los nodos DataNode. Si el NameNode falla no se puede acceder al sistema de ficheros HDFS. Por eso es importante tener alta disponibilidad instalando un NameNode activo y otro pasivo para que en caso de fallo del prime, entre en ejecución el segundo. Solo puede existir un único NameNode funcionado, el cual guarda los metadatos de los ficheros (permisos de ficheros, fechas de creación y acceso, etc) y la información de donde están almacenados los bloques de estos y sus réplicas. Cuanto mayor sea el tamaño total del clúster, más memoria RAM se necesita en el NameNode para guardar la información de los ficheros y sus bloques. 16.1.2. SecundaryNamenode Sirve para liberar la carga del NameNode se puede instalar este servicio en otro nodo, encargándose de guardar una copia de los bloques de datos en memoria que se van modificando y posteriomente actualizándose en el NameNode activo.
  • 47. Sin embargo, este nodo no ofrece la alta disponibilidad, si cae el NameNode se case el sistema de ficheros HDFS y con ello todos los trabajos MapReduce lanzados. La importancia del SecundaryNamenode reside en tener una copia actualizada del fichero que contiene la información de los bloques del clúster. 16.1.3. DataNode Los nodos que guardan físicamente los bloques de los ficheros son los DataNode o nodos esclavos. Cada DataNode guarda solo los bloques de los ficheros y sus checksums para verificar que no están corruptos. 16.1.4. JobTracker El JobTracker es el servicio que se encarga de lanzar y coordinar los trabajos MapReduce a los JobTracker. Normalmente está instalado en el NameNode. Si el JobTracker falla, todos los trabajos MapReduce ejecutados en ese momento fallan. 16.1.5. TaskTracker Son los servicios que ejecutan las tareas Map y Reduce en un DataNode, por tanto se ejecutan en los DataNode. Si un TaskTracker detecta un fallo en la tarea ejecutada en el nodo, avisa al JobTaskTracker y este envía la orden de ejecutar la tarea en otro nodo que contenga los bloques de datos de la tarea fallida. Se ejecuta en el DataNode. 16.2. Instalación del clúster A continuación se detalla el proceso de instalación del clúster con 4 nodos. Para ello se utiliza una máquina virtual con CentOS 6.2 descargada de la documentación del sitio web de Cloudera http://www.cloudera.com/content/support/en/downloads/download-components/download- products.html Pulsar en el enlace QuickStart VM. El usuario del sistema por defecto es cloudera y la contraseña, cloudera. Para la instalación se harán cuatro copias de los archivos de la máquina virtual descargada. Los nodos se identificarán por nombres de animales: • elephant: nodo NameNode, DataNode y TaskTracker. • tiger: nodo SecundaryNamenode, DataNode y TaskTracker. • horse: nodo JobTracker, DataNode y TaskTracker. • monkey: nodo DataNode y TaskTracker. Por defecto la máquina virtual está configurada con el teclado en inglés y la zona horaria de Estados Unidos de la región del Este. 16.2.1. Requisitos Mínimos Para la creación del clúster de cuatro nodos con máquinas virtuales se necesita como mínimo de las siguientes características:
  • 48. • Procesador Intel i3 o similar con dos núcleos • Memoria RAM 8 GB DDR3 1600 Mhz • Disco Duro 500 GB SATA 16.2.2. Desinstalar Cloudera Manager Iniciar la máquina virtual descargada y desinstalar Cloudera Manager. Cloudera Manager es un gestor con interfaz web que se encarga de instalar y actualizar los paquetes de Cloudera. También gestiona el inicio de los servicios de Hadoop y se encarga de lanzarlos en caso de que se paren. Abrir el navegador Firefox y pulsar en el enlace “Coudera Manager”. Iniciar sesión con el usuario y contraseña cloudera. Seleccionar la pestaña Actions general de la parte superior derecha y escoger Stop. Eliminar los datos de Cloudera Manager. $ sudo rm -Rf /usr/share/cmf /var/lib/cloudera* /var/cache/yum/cloudera* $ sudo rm -Rf /etc/cloudera-scm-* Finalizar los servicios de Cloudera Manager $ sudo service cloudera-scm-server stop $ sudo service cloudera-scm-server-db stop $ sudo service cloudera-scm-agent hard_stop Eliminar los paquetes de Cloudera Manager $ sudo yum remove --assumeyes cloudera-manager-server $ sudo yum remove –-assumeyes cloudera-manager-server-db $ sudo yum remove -–assumeyes 'cloudera-manager-*'
  • 49. Comprobar que los servicios de NameNode, DataNode, JobTracker y TaskTracker no están ejecutándose. $ sudo jps Si por algún motivo no se han parado alguno servicios, se paran manualmente. $ for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x stop ; done $ for x in `cd /etc/init.d ; ls hadoop-0.20-mapreduce-*` ; do sudo service $x stop ; done En caso de que no funcione, terminar todos los proceso java. $ sudo killall java Eliminar todos los paquetes de Hadoop, HBase, Hive, Impala, Pig, Hue, Zookeeper, etc. $ sudo yum remove --assumeyes zookeeper $ sudo rm -rf /etc/hadoop/ $ sudo rm -rf /etc/hive/ $ sudo rm -rf /etc/impala/ $ sudo rm -rf /etc/hbase/ $ sudo rm -rf /etc/hue/ sudo rm -rf /etc/pig sudo rm -rf /etc/hadoop-httpfs/ sudo rm -rf /etc/hcatalog/ sudo rm -rf /etc/hbase-solr/ sudo rm -rf /usr/lib/zookeeper/ Dejar instalados los paquetes DataNode y TaskTracker ya que se usarán en los cuatro nodos. $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker 16.3. Crear un Clúster de Hadoop Abrir VirtualBox e ir a Archivo, “Importar Servicio Virtualizado”. Seleccionar el archivo .ovf. de cada copia. El DVD, el controlador USB y la tarjeta de sonido se pueden deshabilitar ya que no son necesarios. Cada máquina virtual necesita como mínimo: • CPU con 1 núcleo
  • 50. • Tarjeta de Red • Memoria RAM de 1.5 GB • Disco Duro 15 GB Pulsar en Importar. La importación de la máquina virtual puede tardar entre 1 y 5 minutos. Para facilitar la instalación se recomienda habilitar “Compartir portapapeles” en Configuración, opción General, pestaña Avanzado y seleccionar Bidireccional. En la misma pestaña es posible cambiar el nombre de la máquina virtual descargada por un nombre identificativo del nodo. Los ficheros .ovf se pueden renombrar, pero los discos *.vmdk si se modifican, se debe especificar el nuevo nombre en la configuración de la importación. Finalmente, una vez importadas las cuatro máquinas, ir a Configuración, opción Red, pesataña “Adaptador 2” y marcar “Habilitar adaptador de red”. En Tipo de adaptador seleccionar Red interna. 16.3.1. Configuración de Red Iniciar las cuatro máquinas virtuales y configurar la segunda interfaz de red con las siguientes IP estáticas bien con network-manager desde el panel de escritorio o editando la configuración de la interfaz de red en /etc/sysconfig/network-scripts/ifcfg-eth1: TYPE=Ethernet BOOTPROTO=none IPADDR=192.168.1.1 PREFIX=24 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="eth1" ONBOOT=yes Las IPs de cada nodo son: • elephant: 192.168.1.1/24
  • 51. • tiger: 192.168.1.2/24 • horse: 192.168.1.3/24 • monkey: 192.168.1.4/24 Añadir las Ips de los 4 nodos en /etc/hosts. Eliminar la línea de localhost.domain $ sudo vim /etc/hosts 192.168.1.1 elephant 192.168.1.2 tiger 192.168.1.3 horse 192.168.1.4 monkey En cada instancia modificar su hostname. $ sudo hostname elephant $ sudo hostname tiger $ sudo hostname horse $ sudo hostname monkey Comprobar conectividad en todas las instancias. $ ping elephant $ ping tiger $ ping horse $ ping monkey Reiniciar la sesión de usuario en los cuatro nodos y comprobar el hostname. $ echo $HOSTNAME
  • 52. 16.3.2. Instalación de paquetes Instalar en cada instancia los paquetes necesarios. • En elephant $ sudo yum install --assumeyes hadoop-hdfs-namenode $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker # Si están, eliminar los paquetes $ sudo yum remove --assumeyes hadoop-hdfs-secondarynamenode $ sudo yum remove --assumeyes hadoop-0.20-mapreduce-jobtracker • En tiger $ sudo yum install --assumeyes hadoop-hdfs-secondarynamenode $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker # Si están, eliminar los paquetes $ sudo yum remove --assumeyes hadoop-hdfs-namenode $ sudo yum remove --assumeyes hadoop-0.20-mapreduce-jobtracker • En horse $ sudo yum install --assumeyes hadoop-0.20-mapreduce-jobtracker $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker # Eliminar los paquetes $ sudo yum remove --assumeyes hadoop-hdfs-namenode $ sudo yum remove --assumeyes hadoop-hdfs-secondarynamenode • En monkey $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker # Eliminar los siguientes paquetes $ sudo yum remove --assumeyes hadoop-hdfs-namenode $ sudo yum remove --assumeyes hadoop-hdfs-secondarynamenode $ sudo yum remove --assumeyes hadoop-0.20-mapreduce-jobtracker 16.3.3. Configuración En todos los nodos, crear la carpeta de configuración. $ sudo mv /etc/hadoop/conf /etc/hadoop/conf.alternatives $ sudo mv /etc/hadoop/conf.empty /etc/hadoop/conf Desde elephant editar los ficheros de configuración. $ sudo vi /etc/hadoop/conf/core-site.xml
  • 53. <configuration> <property> <name>fs.default.name</name> <value>hdfs://elephant:8020</value> </property> </configuration> sudo vi /etc/hadoop/conf/hdfs-site.xml <configuration> <property> <name>dfs.name.dir</name> <value>/disk1/dfs/nn,/disk2/dfs/nn</value> </property> <property> <name>dfs.data.dir</name> <value>/disk1/dfs/dn,/disk2/dfs/dn</value> </property> <property> <name>dfs.http.address</name> <value>elephant:50070</value> </property> </configuration> sudo vi /etc/hadoop/conf/mapred-site.xml <?xml version="1.0"?> <configuration> <property> <name>mapred.local.dir</name> <value>/disk1/mapred/local,/disk2/mapred/local</value> </property> <property> <name>mapred.job.tracker</name> <value>horse:8021</value> </property> <property> <name>mapred.system.dir</name> <value>/mapred/system</value> </property> <property> <name>mapreduce.jobtracker.staging.root.dir</name> <value>/user</value> </property> </configuration> # Variables de entorno de Hadoop $ sudo vi /etc/hadoop/conf/hadoop-env.sh export HADOOP_NAMENODE_OPTS="-Xmx64m" export HADOOP_SECONDARYNAMENODE_OPTS="-Xmx64m" export HADOOP_DATANODE_OPTS="-Xmx64m"
  • 54. export HADOOP_JOBTRACKER_OPTS="-Xmx64m" export HADOOP_TASKTRACKER_OPTS="-Xmx64m" $ sudo chmod +x /etc/hadoop/conf/hadoop-env.sh Copiar la configuración en todos los nodos $ sudo yum install --assumeyes sshpass $ vim ~/copy_config.sh #!/bin/bash sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@monkey:/etc/hadoop/conf/ echo done $ chmod +x copy_config.sh $ ./copy_config.sh Crear directorios para HDFS en todos los nodos sudo mkdir -p /disk1/dfs/nn sudo mkdir -p /disk2/dfs/nn sudo mkdir -p /disk1/dfs/dn sudo mkdir -p /disk2/dfs/dn sudo mkdir -p /disk1/mapred/local sudo mkdir -p /disk2/mapred/local # Cambiar propietarios
  • 55. sudo chown -R hdfs:hadoop /disk1/dfs/nn sudo chown -R hdfs:hadoop /disk2/dfs/nn sudo chown -R hdfs:hadoop /disk1/dfs/dn sudo chown -R hdfs:hadoop /disk2/dfs/dn sudo chown -R mapred:hadoop /disk1/mapred/local sudo chown -R mapred:hadoop /disk2/mapred/local Desde elephant formatear HDFS e iniciar el NameNode $ sudo service hadoop-hdfs-namenode stop $ sudo -u hdfs hdfs namenode -format $ sudo service hadoop-hdfs-namenode start # Comprobar el proceso $ sudo jps -lvm En tiger iniciar el Secundary-Namenode $ sudo service hadoop-hdfs-secondarynamenode start En todos los nodos iniciar el DataNode $ sudo service hadoop-hdfs-datanode start Crear los directorios HDFS de usuario desde elephant $ sudo -u hdfs hadoop fs -mkdir /user/cloudera $ sudo -u hdfs hadoop fs -chown cloudera /user/cloudera # Crear MapRed dir $ sudo -u hdfs hadoop fs -mkdir /mapred/system $ sudo -u hdfs hadoop fs -chown mapred:hadoop /mapred/system En horse inicar el JobTracker de MapReduce $ sudo service hadoop-0.20-mapreduce-jobtracker start Se puede comprobar los logs desde la interfaz web en http://horse:50030/jobtracker.jsp Iniciar el TaskTracker en todos los nodos. $ sudo service hadoop-0.20-mapreduce-tasktracker start El clúster está configurado con acceso a HDFS y MapReduce disponible.
  • 56. 16.4. Alta Disponibilidad del NameNode La configuración de alta disponibilidad para el NameNode utiliza dos nodos, uno activo y otro pasivo también llamado standby. El NameNode pasivo necesita tener acceso a los últimos metadatos actualizados antes de un fallo en el NameNode activo. Para ello, los metadatos se almacenan en otros nodos del clúster llamados JournalNodes. Puede haber uno o varios JournalNode. En el proceso de un NameNode con alta disponibilidad, cuando un cliente envía ficheros a HDFS se generan nuevo metadatos. El NameNode guarda los nuevos metadatos en memoria y se los envía a los JournalNodes. La escritura en JournalNode la hace el demonio del NameNode activo, ya está instalado no hace falta añadir ningún demonio nuevo. El NameNode en standby recupera las últimas modificaciones de los metadatos de los JournalNodes y los añade a memoria. Por otro lado, los DataNode envían señales de vida o heartbeats a ambos NameNodes para indicar que están en funcionamiento. Es posible crear un clúster de alta disponibilidad con al menos 3 JournalNode. Se necesitan tener disponibles más de la mitad de los JournalNodes para que funcionen ambos NameNode, por eso se suele trabajar con un número de JournalNode impar. Para que el NameNode considere exitosa la escritura en al menos dos JournalNodes se utiliza el algoritmo de Paxos3 . En la alta disponibilidad no hay SecundaryNamenode. La función de checkpoint ya la realiza el NameNode pasivo o standby. 3 http://es.wikipedia.org/wiki/Algoritmo_de_Paxos
  • 57. 16.4.1. Failover Automático Por defecto, si falla el NameNode activo, se debe realizar manualmente la activación del NameNode pasivo. Es decir, si el nodo maestro cae, el administrador tiene que cambiar de pasivo a activo el NameNode en standby. Es posible hacer que el cambio se haga de forma automática con Zookeeper. Zookeeper es un demonio controlador de fallos que funciona en cada NameNode como un servicio de repositorio de datos. Para su funcionamiento se necesita un grupo de nodos con Zookeeper instalado llamado quorum de nodos. Normalmente se utilizan entre 3 y 5 nodos. Se puede instalar en los NameNode. 16.5. Clúster de Hadoop con Alta Disponibilidad Para crear un clúster de alta disponibilidad se pueden utilizar las mismas máquinas virtuales de Cloudera. En este caso no es necesario instalar un SecundaryNameNode, sino que se instalarán dos NameNodes, uno activo y otro pasivo. A continuación se detalla la instalación del NameNode con alta disponibilidad. 16.5.1. Instalación de paquetes Instalar en cada instancia los paquetes necesarios. • En elephant $ sudo yum install --assumeyes hadoop-hdfs-namenode $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker $ sudo yum install --assumeyes hadoop-hdfs-journalnode $ sudo yum install --assumeyes zookeeper $ sudo yum install --assumeyes zookeeper-server • En tiger $ sudo yum install --assumeyes hadoop-hdfs-namenode $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker $ sudo yum install --assumeyes hadoop-hdfs-journalnode $ sudo yum install --assumeyes zookeeper $ sudo yum install --assumeyes zookeeper-server • En horse $ sudo yum install --assumeyes hadoop-0.20-mapreduce-jobtracker $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker $ sudo yum install --assumeyes hadoop-hdfs-journalnode $ sudo yum install --assumeyes zookeeper $ sudo yum install --assumeyes zookeeper-server • En monkey
  • 58. $ sudo yum install --assumeyes hadoop-hdfs-datanode $ sudo yum install --assumeyes hadoop-0.20-mapreduce-tasktracker 16.5.2. Configuración Editar los archivos de configuración de Hadoop core-site.xml, hdfs-site.xml. $ sudo vi /etc/hadoop/conf/core-site.xml <property> <name>fs.default.name</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>elephant:2181,tiger:2181,horse:2181</value> </property> El valor hdfs://mycluster se define a continuación, en la configuración de hdfs-site.xml. $ sudo vi /etc/hadoop/conf/hdfs-site.xml <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>elephant:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>tiger:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>elephant:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>tiger:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://elephant:8485;tiger:8485;horse:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/disk1/dfs/jn</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider </value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value>
  • 59. </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> Nn1 y nn2 son los nombres identificadores de los dos NameNode. Nn1 será el nombre asignado al NameNode de elephant y nn2 el de tiger. El valor de dfs.ha.automatic-failover.enabled activa el Failover automático, gestionado por una cola de procesos Zookeeper. En dfs.ha.fencing.methods se indica el comando ha ejecutar en caso de fallo, por ejemplo para avisar al administrador de que el NameNode ha caído. Configurar mapred-site.xml para MapReduce. $ sudo vi /etc/hadoop/conf/mapred-site.xml <?xml version="1.0"?> <configuration> <property> <name>mapred.local.dir</name> <value>/disk1/mapred/local,/disk2/mapred/local</value> </property> <property> <name>mapred.job.tracker</name> <value>horse:8021</value> </property> <property> <name>mapred.system.dir</name> <value>/mapred/system</value> </property> <property> <name>mapreduce.jobtracker.staging.root.dir</name> <value>/user</value> </property> </configuration> Configurar las variables de entorno utilizadas en Hadoop. Indicar la memoria reservada para cada servicio. Como se está ejecutando 4 máquinas virtuales en un entorno con memoria limitada, se reduce a 64 Megas por servicio. NOTA: En un clúster real se deben ajustar para la memoria necesaria para cada proceso Java, teniendo siempre en cuenta el resto de servicios ejecutados en cada nodo. $ sudo vi /etc/hadoop/conf/hadoop-env.sh export HADOOP_NAMENODE_OPTS="-Xmx64m" export HADOOP_SECONDARYNAMENODE_OPTS="-Xmx64m" export HADOOP_DATANODE_OPTS="-Xmx64m" export HADOOP_JOBTRACKER_OPTS="-Xmx64m" export HADOOP_TASKTRACKER_OPTS="-Xmx64m" export HADOOP_JOURNALNODE_OPTS="-Xmx64m" export HADOOP_ZKFC_OPTS="-Xmx64m" $ sudo chmod +x /etc/hadoop/conf/hadoop-env.sh
  • 60. Copiar la configuración en todos los nodos. NOTA: Obviar la creación del script copy_config.sh si ya se ha realizado en el paso anterior. $ sudo yum install --assumeyes sshpass $ vim ~/copy_config.sh #!/bin/bash sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/core-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hdfs-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/mapred-site.xml root@monkey:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@tiger:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@horse:/etc/hadoop/conf/ sshpass -p 'cloudera' scp /etc/hadoop/conf/hadoop-env.sh root@monkey:/etc/hadoop/conf/ echo done $ chmod +x copy_config.sh $ ./copy_config.sh Crear directorios para HDFS en todos los nodos sudo mkdir -p /disk1/dfs/nn sudo mkdir -p /disk2/dfs/nn sudo mkdir -p /disk1/dfs/dn sudo mkdir -p /disk2/dfs/dn sudo mkdir -p /disk1/mapred/local sudo mkdir -p /disk2/mapred/local # Cambiar propietarios sudo chown -R hdfs:hdfs /disk1/dfs/nn sudo chown -R hdfs:hdfs /disk2/dfs/nn sudo chown -R hdfs:hdfs /disk1/dfs/dn sudo chown -R hdfs:hdfs /disk2/dfs/dn sudo chown -R mapred:mapred /disk1/mapred/local sudo chown -R mapred:mapred /disk2/mapred/local
  • 61. En elephant, tiger y horse, crear directorios para los metadatos en los JournalNodes $ sudo mkdir -p /disk1/dfs/jn $ sudo chown -R hdfs:hdfs /disk1/dfs/jn Iniciar los JournalNode $ sudo service hadoop-hdfs-journalnode start $ sudo jps | grep JournalNode A continuación se procede a configurar los servicios de Zookeeper para añadir Failover automático. En elephant, tiger y horse, crear los directorios de datos de ZooKeeper $ sudo mkdir -p /disk1/dfs/zk $ sudo chown zookeeper:zookeeper -R /disk1/dfs/zk/ Es importante que la ruta donde se guardarán los datos del servidor Zookeeper pertenezca al usuario y grupo zookeeper. En elephant, crear el fichero de configuración de ZooKeeper en la ruta /etc/zookeeper/conf/zoo.cfg. $ sudo mv /etc/zookeeper/conf/zoo.cfg /etc/zookeeper/conf/zoo.cfg.bak $ sudo vi /etc/zookeeper/conf/zoo.cfg tickTime=2000 dataDir=/disk1/dfs/zk clientPort=2181 initLimit=5 syncLimit=2 server.1=elephant:2888:3888 server.2=tiger:2888:3888 server.3=horse:2888:3888 Copiar configuración de elephant a tiger y horse. $ sshpass -p 'cloudera' scp /etc/zookeeper/conf/zoo.cfg root@tiger:/etc/zookeeper/conf/ $ sshpass -p 'cloudera' scp /etc/zookeeper/conf/zoo.cfg root@horse:/etc/zookeeper/conf/ En elephant, tiger y horse, iniciar los servicios de Zookeeper. # En elephant con el id 1 $ sudo service zookeeper-server init --force -–myid=1 # En tiger con el id 2 $ sudo service zookeeper-server init --force --myid=2 # En horse con el id 3 $ sudo service zookeeper-server init --force --myid=3 # Iniciar el servicio en las tres instancias $ sudo service zookeeper-server start $ sudo jps | grep QuorumPeerMain En elephant, formatear el sistema de ficheros HDFS.
  • 62. NOTA: Obviar este paso si ya estaba creado en la configuración de un clúster de Hadoop. # Parar el servicio del NameNode $ sudo service hadoop-hdfs-namenode stop $ sudo -u hdfs hdfs namenode -format # Acceptar Re-format filesystem in Storage Directory y en Re-format filesystem in QJM (quorum). Convertir un NameNode sin HA a un NameNode con HA, es necesario reinicializar los metadatos edits en modo compartido. $ sudo -u hdfs hdfs namenode -initializeSharedEdits # Acceptar Re-format filesystem in QJM Iniciar el NameNode $ sudo service hadoop-hdfs-namenode start $ sudo jps | grep NameNode Verificar que está en modo StandBy $ sudo -u hdfs hdfs haadmin -getServiceState nn1 Si se instenta acceder a HDFS dará un error ya que todavía no está activo ningún NameNode $ sudo -u hdfs hadoop fs -ls / En tiger, iniciar el NameNode Standby. $ sudo -u hdfs hdfs namenode -bootstrapStandby # Acceptar Re-format filesystem in Storage Directory $ sudo service hadoop-hdfs-namenode start $ sudo jps | grep NameNode Comprobar estado del NameNode de tiger (nombre nn2 configurado en hdfs-site.xml) $ sudo -u hdfs hdfs haadmin -getServiceState nn2 Por ahora todos los dos NameNode están en estado pasivo, standby.
  • 63. En elephant y tiger, instalar Failover Controller, formatear el znode e iniciar servicio $ sudo yum install --assumeyes hadoop-hdfs-zkfc # Formatear solo desde una de las instancias $ sudo -u hdfs hdfs zkfc -formatZK $ sudo service hadoop-hdfs-zkfc start $ sudo jps | grep DFSZKFailoverController Verificar que los estados de los NameNode son active y standby $ sudo -u hdfs hdfs haadmin -getServiceState nn1 $ sudo -u hdfs hdfs haadmin -getServiceState nn2 Ir a http://elephant:50070/dfshealth.jsp y comprobar que aparece NameNode 'elephant:8020' como active. Ir a http://tiger:50070/dfshealth.jsp y comprobar que aparece el NameNode 'tiger:8020' como standby. Iniciar los DataNodes en las 4 instancias. $ sudo service hadoop-hdfs-datanode start Crear los directorios HDFS de usuario $ sudo -u hdfs hadoop fs -mkdir /user/cloudera $ sudo -u hdfs hadoop fs -chown cloudera /user/cloudera # Crear MapRed dir $ sudo -u hdfs hadoop fs -mkdir /mapred/system $ sudo -u hdfs hadoop fs -chown mapred:hadoop /mapred/system # Comprobar directorios
  • 64. $ sudo -u hdfs hadoop fs -ls -R / En horse, inicar el JobTracker. $ sudo service hadoop-0.20-mapreduce-jobtracker start $ sudo jps | grep JobTracker Iniciar los TaskTracker en las 4 instancias. $ sudo service hadoop-0.20-mapreduce-tasktracker start $ sudo jps | grep TaskTracker Comprobar que el failover automático funciona. Parar el NameNode activo en elephant. $ sudo service hadoop-hdfs-namenode stop Comprobar que el NameNode de tiger ahora está activo. $ sudo -u hdfs hdfs haadmin -getServiceState nn2 # Iniciar de nuevo el NameNode nn1 en elephant. $ sudo service hadoop-hdfs-namenode start $ sudo -u hdfs hdfs haadmin -getServiceState nn1 # Si se comprueba antes de reiniciar el NameNode dará error. $ sudo -u hdfs hdfs haadmin -getServiceState nn2 Aunque se levante el NameNode activo de nuevo, no pasa a estado activo directamente, sino que elephant se inicia quedando en estado pasivo o standby. Si se desea cambiar los estados hay que parar el NameNode de tiger y luego levantarlo de nuevo. $ sudo service hadoop-hdfs-namenode stop $ sudo service hadoop-hdfs-namenode start Comprobar que ahora sí está activo el NameNode en elephant. $ sudo -u hdfs hdfs haadmin -getServiceState nn2 $ sudo -u hdfs hdfs haadmin -getServiceState nn1
  • 65. 16.6. Alta Disponibilidad en el JobTracker El JobTracker es el servicio que se encarga de gestionar los trabajos MapReduce lanzados por los clientes. Si el JobTracker falla, todos los trabajos en ejecución fallan. Por eso es interesante configurar el JobTracker en modo HA o High Avaliability. Al igual que en el NameNode con alta disponibilidad, se puede configurar un JobTracker con HA utilizando como mínimo 3 nodos. El JobTracker sin alta disponibilidad se encuentra disponible en la instancia horse. Para habilitar la alta disponibilidad es necesario desinstalar el paquete e instalar el paquete hadoop-0.20-mapreduce- jobtrackerha. Parar los TaskTracker en todos los nodos . $ sudo service hadoop-0.20-mapreduce-tasktracker stop Parar el JobTracker de Horse $ sudo service hadoop-0.20-mapreduce-jobtracker stop # verificar que están parados los demonios ps -eaf | grep -i job ps -eaf | grep -i task Desinstalar JobTracker de horse $ sudo yum remove --assumeyes hadoop-0.20-mapreduce-jobtracker En elephant y tiger, instalar JobTracker con alta disponibilidad, es ideal instalar este servicio en los nodos NameNode activo y pasivo. $ sudo yum install --assumeyes hadoop-0.20-mapreduce-jobtrackerha Instalar además el failover automático para MapReduce con Zookeeper. Previamente debe estar instalado ZooKeeper en 3 nodos, este paso ya ha sido realizado en la instalación del NameNode con alta disponibilidad. $ sudo yum install --assumeyes hadoop-0.20-mapreduce-zkfc En elephant, configurar los JobTrackers en /etc/hadoop/conf/mapred-site.xml $ sudo vi /etc/hadoop/conf/mapred-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapred.local.dir</name> <value>/disk1/mapred/local,/disk2/mapred/local</value> </property> <property> <name>mapred.job.tracker</name> <value>logicaljt</value> </property> <property>
  • 66. <name>mapred.jobtrackers.logicaljt</name> <value>jt1,jt2</value> <description>Comma-separated list of JobTracker IDs.</description> </property> <property> <name>mapred.jobtracker.rpc-address.logicaljt.jt1</name> <!-- RPC address for jt1 --> <value>elephant:8021</value> </property> <property> <name>mapred.jobtracker.rpc-address.logicaljt.jt2</name> <!-- RPC address for jt2 --> <value>tiger:8022</value> </property> <property> <name>mapred.job.tracker.http.address.logicaljt.jt1</name> <!-- HTTP bind address for jt1 --> <value>0.0.0.0:50030</value> </property> <property> <name>mapred.job.tracker.http.address.logicaljt.jt2</name> <!-- HTTP bind address for jt2 --> <value>0.0.0.0:50031</value> </property> <property> <name>mapred.ha.jobtracker.rpc-address.logicaljt.jt1</name> <!-- RPC address for jt1 HA daemon --> <value>elephant:8023</value> </property> <property> <name>mapred.ha.jobtracker.rpc-address.logicaljt.jt2</name> <!-- RPC address for jt2 HA daemon --> <value>tiger:8024</value> </property> <property> <name>mapred.ha.jobtracker.http-redirect-address.logicaljt.jt1</name> <!-- HTTP redirect address for jt1 --> <value>elephant:50030</value> </property> <property> <name>mapred.ha.jobtracker.http-redirect-address.logicaljt.jt2</name> <!-- HTTP redirect address for jt2 --> <value>tiger:50031</value> </property> <property> <name>mapred.jobtracker.restart.recover</name> <value>true</value> </property> <property> <name>mapred.job.tracker.persist.jobstatus.active</name> <value>true</value> </property> <property>
  • 67. <name>mapred.job.tracker.persist.jobstatus.hours</name> <value>1</value> </property> <property> <name>mapred.job.tracker.persist.jobstatus.dir</name> <value>/jobtracker/jobsInfo</value> </property> <property> <name>mapred.client.failover.proxy.provider.logicaljt</name> <value>org.apache.hadoop.mapred.ConfiguredFailoverProxyProvider</value> </property> <property> <name>mapred.client.failover.max.attempts</name> <value>15</value> </property> <property> <name>mapred.client.failover.sleep.base.millis</name> <value>500</value> </property> <property> <name>mapred.client.failover.sleep.max.millis</name> <value>1500</value> </property> <property> <name>mapred.client.failover.connection.retries</name> <value>0</value> </property> <property> <name>mapred.client.failover.connection.retries.on.timeouts</name> <value>0</value> </property> <property> <name>mapred.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>mapred.system.dir</name> <value>/mapred/system</value> </property> <property> <name>mapreduce.jobtracker.staging.root.dir</name> <value>/user</value> </property> </configuration> Copiar la configuración de mapred-site.xml al resto de nodos. ./copy_config.sh En elephant, crear el directorio para la información del JobTracker con HA. $ sudo -u hdfs hadoop fs -mkdir /jobtracker/jobsInfo
  • 68. $ sudo -u hdfs hadoop fs -chown mapred /jobtracker/jobsInfo En elephant y tiger , iniciar el JobTracker HA. $ sudo service hadoop-0.20-mapreduce-jobtrackerha start $ sudo jps | grep JobTrackerHADaemon En elephant y tiger , ver estados de los JobTracker HA. $ sudo -u mapred hadoop mrhaadmin -getServiceState jt1 $ sudo -u mapred hadoop mrhaadmin -getServiceState jt2 Ambos están en standby, todavía no se a activado ningún JobTracker. En elephant, cambiar el JobTracker a modo activo. Es importante no haber habilitado todavía el failover automático para poder realizar el cambio manual. $ sudo -u mapred hadoop mrhaadmin -transitionToActive jt1 $ sudo -u mapred hadoop mrhaadmin -getServiceState jt1 Configurar el failover automático. Añadir a mapred-site.xml la propiedad mapred.ha.automatic- failover.enabled y el puerto de escucha de Zookeeper. El puerto debe ser distinto al utilizado para los puertos de Zookeeper para el NameNode con alta disponibilidad. $ sudo vi /etc/hadoop/conf/mapred-site.xml <property> <name>mapred.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>mapred.ha.zkfc.port</name> <value>8018</value> <!-- Pick a different port for each failover controller when running one machine --> </property> Si no se han añadido los nodos con el servicio de Zookeeper en el NameNode de alta disponibilidad, añadir a la configuración de core-site.xml el quorum de nodos de Zookeeper. Si ya está configurado, obviar esta parte. $ sudo vi /etc/hadoop/conf/core-site.xml <property>
  • 69. <name>ha.zookeeper.quorum</name> <value>elephant:2181,tiger:2181,horse:2181</value> <!-- Zookeeper ensemble addresses --> </property> Copiar la configuración a todos los nodos. $ ./copy_config.sh En elephant, iniciar ZooKeeper MapReduce $ sudo service hadoop-0.20-mapreduce-zkfc init En elephant y tiger, reiniciar Zookeeper para MapReduce y los JobTracker. $ sudo service hadoop-0.20-mapreduce-zkfc restart $ sudo service hadoop-0.20-mapreduce-jobtrackerha restart Verificar el estado de los JobTracker. $ sudo -u mapred hadoop mrhaadmin -getServiceState jt1 $ sudo -u mapred hadoop mrhaadmin -getServiceState jt2 Matar el proceso del Jobtracker en el nodo activo, en este caso debería ser elephant . $ sudo jps | grep JobTracker <id> JobTraceker $ sudo kill -9 <id> # Verificar que ya no está el proceso $ sudo jps | grep JobTracker Verificar el estado del actual de los JobTracker. $ sudo -u mapred hadoop mrhaadmin -getServiceState jt1 $ sudo -u mapred hadoop mrhaadmin -getServiceState jt2
  • 70. Reiniciar el JobTracker de elephant y levantar los TaskTracker en todos los nodos. $ sudo service hadoop-0.20-mapreduce-jobtrackerha restart $ sudo service hadoop-0.20-mapreduce-tasktracker start Ahora están todos los servicios del clúster de Hadoop iniciados con alta disponibilidad para el NameNode y el JobTracker.
  • 71. 16.7. MapReduce en el clúster Ejecutar varios ejemplos de MapReduce. 16.7.1. Wordcount Con el usuario training ejecutar en el clúster de alta disponibilidad. $ mkdir shakespeare && cd shakespeare $ wget http://www3.nd.edu/~ccl/software/tutorials/ndtut12/makeflow/shakespeare- text.tgz $ tar zxvf shakespeare-text.tgz $ hadoop fs -mkdir shakespeare $ hadoop fs -put *.txt shakespeare/ $ hadoop fs -ls shakespeare/ $ hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar wordcount shakespeare output-wordcount El JobTracker activo en el ejemplo es tiger, configurado en el puerto 50031. Desde la interfaz web se puede ver la información del JobTracker y los trabajos lanzados o en ejecución. Pulsando sobre en enlace del Jobid se accede a la información del trabajo de MapReduce word count.
  • 72. En la información del trabajo se pueden ver las tareas de tipo Map y Reduce, el número de tareas pendientes, en ejecución, completadas y fallidas. Pulsando sobre en enlace del número de tareas Map completadas se accede a la información de las mismas tareas. La lista de tareas Map muestra las tareas completadas. Para más detalles pulsar sobre una tarea. La tarea Map se ejecutó en el nodo tiger. El bloque de datos se leyó del nodo monkey, en la tabla Input Split Locations se indican en que nodos está replicado el bloque de datos de entrada utilizado en esta tarea.
  • 73. Del mismo modo se puede acceder al detalle de las tareas Reduce. Si en el directorio de entrada shakespeare hubiesen varios ficheros de más de 64 MB, tamaño de bloque por defecto en Hadoop, se generarían varias tareas en varios nodos del clúster. Por defecto, cada bloque de datos se almacena en 3 nodos distintos y cada nodo ejecuta como máximo 2 tareas simultáneas. Por ese motivo en la configuración del clúster se añadieron rutas a dos discos distintos /disk1 y /disk2 para así optimizar lecturas de los bloques durante la ejecución de las tareas simultáneas. Hadoop optimizará en la medida de los posible el reparto de tareas a los nodos en función de la proximidad de los datos. 17. Seguridad Un clúster de Hadoop por defecto no tiene ningún tipo de seguridad. Cualquiera que tenga acceso a la red del clúster puede hacerse pasar por el NameNode o el JobTracker con ténicas de DNS spoofing4 . Además, un equipo al que se tenga acceso de adminitrador puede acceder a todas las carpetas de los usuarios y realizar cualquier cambio en el sistema de ficheros HDFS. Por ejemplo, instalando el cliente en un equipo. $ sudo apt-get install hadoop-client # Configurar el NameNode en /etc/hadoop/core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://[hostname_namenode]:8020</value> </property> $ sudo -u hdfs hadoop fs -ls / $ sudo -u hdfs hadoop fs -rm -r /* HDFS soporta permisos de usuario y de grupo lectura, escritura y ejecución. Pero no hay autenticación, solo existe del lado del cliente. Hadoop tampoco utiliza cifrado de datos del disco. Aunque los datos están repartidos en bloques de 64 MB o más, si alguien extrae un disco podría obtener la información contenido a partir de los bloques y el fichero “edits” del NameNode. La razón de no cifrar los datos en disco reside en la 4 http://en.wikipedia.org/wiki/DNS_spoofing
  • 74. eficiencia de los trabajos MapReduce para aumentar la compresión de los datos al enviarse a través de los nodos. Para la transmisión de datos entre los nodos se puede configurar IPSec independiente para cifrar el tráfico. La seguridad de un cluster está orientado al aislamiento. Debería estar en una red privada. Los accesos a los nodos/red deben estar restringidos a usuarios no legítimos. Para que un cliente pueda lanzar trabajos MapReduce es suficiente con tener acceso al nodo del JobTracker. No necesita acceso a los DataNode en ningún momento. En resumen, permitir a los clientes accesos a los puertos del NameNode y el JobTracker. Permitir el tráfico de estos con los DataNode y TaskTracker. Si se desea añadir autenticación del lado servidor hay que añadir Kerberos y configurar cada servicio de Hadoop. Los requisitos para poder tener autenticación con Kerberos son: • Tener configurado el clúster de Hadoop y probar antes su funcionamiento. • Instalar el servidor de Kerberos KDC. • Instalar las bibliotecas de Kerberos en todos los nodos del clúster. Algunas aplicaciones necesitan añadir configuración adicional para el uso de Kerberos, por ejemplo MapReduce y Hive. Pig y Sqoop no lo necesitan. 18. 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 Guía de Instalación de Alta Disponibilidad de Cloudera http://www.cloudera.com/content/cloudera- content/cloudera-docs/CDH4/latest/CDH4-High-Availability-Guide/CDH4-High-Availability- Guide.html Guía de Instalación de Kerberos de Cloudera http://www.cloudera.com/content/cloudera- content/cloudera-docs/CDH4/4.3.0/CDH4-Security-Guide/CDH4-Security-Guide.html WHITE, Tom. Hadoop: The Definitive Guide. O'Reilly. 2013