Hadoop – Ejemplos de hadoop-mapreduce-examples.jar

Hadoop MapReduce Una de las formas tradicionales de asegurarnos que un ambiente de Hadoop recién instalado funciona correctamente, es ejecutando el siempre presente jar de ejemplos map-reduce incluido con toda instalación de hadoop. Hablamos del hadoop-mapreduce-examples.jar.

 

En este tutorial, haremos un ejercicio que consiste en encontrar todas las apariciones de una palabra usando una expresión regular. Para hacerlo, crearemos un directorio llamado input en nuestro directorio de inicio y copiaremos los archivos de configuración (los xml) de Hadoop para usar esos archivos como nuestros datos de entrada.

Nota: la tilde (~) es un atajo muy útil en Bash para no tener que escribir la ruta de nuestra carpeta de usuario.

mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

A continuación, podemos usar el siguiente comando para ejecutar el programa (jar) hadoop-mapreduce-examples, un archivo Java con varias opciones. Invocaremos grep, uno de los muchos ejemplos incluidos en hadoop-mapreduce-examples, seguido por el directorio de entrada inputy el directorio de salida grep_example. El programa MapReduce grep contará las coincidencias de una palabra literal o expresión regular. Finalmente, proporcionaremos una expresión regular para encontrar ocurrencias de la palabra principaldentro o al final de una oración declarativa. La expresión distingue entre mayúsculas y minúsculas, por lo que no encontraríamos la palabra si estuviera en mayúscula al comienzo de una oración:

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar grep ~/input ~/grep_example 'principal[.]*'

El comando consta de las siguientes partes:

  1. /usr/local/hadoop/bin/hadoop Es el directorio donde esta el ejecutable de hadoop en el sistema.
  2. jar Le indica a hadoop que deseamos ejecutar una aplicacion empaquetada de Java. (Jar)
  3. /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar Es la ruta donde esta el Jar que deseamos ejecutar. Note que la versión del jar depende de la versión de hadoop instalada.
  4. grep Es un parámetro de los muchos que se le pueden pasar al Jar de ejemplos que trae Hadoop. grep sirve para encontrar y contar ocurrencias de strings haciendo uso de expresiones regulares. Para ver una lista de los ejemplos que trae, click aquí.
  5. ~/input El directorio de entrada. Es donde el programa va a buscar los archivos de entrada a la tarea de map-reduce. Aquí copiamos unos archivos de prueba en un comando anterior.
  6. ~/grep_example El directorio de salida. Es donde el programa va a escribir el resultado de la corrida de la aplicación. En este caso, la cantidad de veces que la palabra del parámetro siguiente, aparece en los archivos de entrada.
  7. ‘principal[.]*’ Es la expresión regular que deseamos buscar. Esta expresión regular en particular coincide con la palabra ‘principal’ y ‘principal.’ (con y sin punto al final). Si desean saber un poco mas de expresiones regulares, les recomiendo este sitio web.

Cuando la tarea finaliza, proporciona un resumen de lo que se ha procesado y los errores que ha encontrado, pero esto no contiene los resultados reales.

. . .
 File System Counters
 FILE: Number of bytes read=1247674
 FILE: Number of bytes written=2324248
 FILE: Number of read operations=0
 FILE: Number of large read operations=0
 FILE: Number of write operations=0
 Map-Reduce Framework
 Map input records=2
 Map output records=2
 Map output bytes=37
 Map output materialized bytes=47
 Input split bytes=114
 Combine input records=0
 Combine output records=0
 Reduce input groups=2
 Reduce shuffle bytes=47
 Reduce input records=2
 Reduce output records=2
 Spilled Records=4
 Shuffled Maps =1
 Failed Shuffles=0
 Merged Map outputs=1
 GC time elapsed (ms)=61
 Total committed heap usage (bytes)=263520256
 Shuffle Errors
 BAD_ID=0
 CONNECTION=0
 IO_ERROR=0
 WRONG_LENGTH=0
 WRONG_MAP=0
 WRONG_REDUCE=0
 File Input Format Counters
 Bytes Read=151
 File Output Format Counters
 Bytes Written=37

Nota: Si el directorio de salida ya existe, el programa fallará, y en lugar de ver el resumen, la salida se verá algo así como:

 . . .
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

Los resultados se almacenan en el directorio de salida (~/grep_example/) y se pueden verificar ejecutando caten el directorio de salida:

cat ~/grep_example/*
 6 principal
 1 principal.

La tarea MapReduce encontró una aparición de la palabra principal seguida de un punto y seis apariciones en las que no estaba el punto. La ejecución del programa de ejemplo ha verificado que nuestra instalación autónoma (standalone, un solo servidor) funciona correctamente y que los usuarios no privilegiados del sistema pueden ejecutar Hadoop para su exploración o depuración.

Otros Ejemplos de Hadoop MapReduce

Vale la pena probar otros ejemplos contenidos en el jar, como por ejemplo:

  • Terasort: Se usa normalmente para hacer Benchmarking en clusters de hadoop.
  • PI: Calcula los decimales de PI usando MapReduce!

Acceder data en HDFS desde Python

Cuando se trabaja con Big Data, independientemente de si usamos Spark o trabajos Map-Reduce, generalmente nos encontraremos con el sistema de archivos distribuidos de Hadoop, HDFS.

El problema con HDFS siempre ha sido que acceder/modificar la data es un proceso tedioso, que casi siempre involucra realizar comandos dfs en una consola. Esto dificulta muchísimo automatizar scripts (a excepción de shell scripts) para realizar nuestras consultas.  Por esta razón, el equipo de Hadoop creó HttpFs, el cual es un portal hacia HDFS haciendo uso de servicios Rest que corren en el Namenode.

hdfsstatus

Para Python, les recomiendo el excelente proyecto Open-Source HdfsCLIEl mismo no es más que una atadura al propio servicio de HttpFS (y WebHDFS) que provee la mayoría de los métodos relevantes a través de un API y una interfaz de CLI.

La documentación está disponible en: https://hdfscli.readthedocs.io/en/latest/

Panama PyData 2: Spark vs Pandas Dataframes

Comparto con los asistentes al Meetup del 24 de Septiembre de PyData Panama, la presentación que acompaña mi taller: Pandas vs Spark Dataframes – Una introducción a las arquitecturas distribuidas.

Los notebooks de iPython que acompañaron el taller están disponibles en mi repo en GitHub: https://github.com/sansagara/Panama-PyData

PySpark Talk
PySpark Talk

Los invito entonces a unise al grupo  http://meetu.ps/e/C15vZ/xHDxP/f

Big Data: El ecosistema básico en las empresas.

Es bien sabido que en la actualidad, cuando hablamos de Big Data, no nos referimos a una sola herramienta (aunque a muchos nos venga el nombre ‘Hadoop’ a la mente). En este corto post, listo algunas de las herramientas mas básicas y comunes en despliegues empresariales de soluciones Big Data:

El Stack de una solución Big Data clásica. (Sin Spark).
El Stack de una solución Big Data clásica. (Sin Spark).

El ecosistema básico

  • Hadoop: La herramienta base de cualquier solución Big Data. Fundamentado en el procesamiento paralelo usando una tecnica llamada ‘Map-Reduce’ y un sistema de archivos distribuidos denominado ‘Hadoop File-System (HDFS)’. El origen de su nombre es todo un misterio…
  • Hive: Desarrollado en Facebook para facilitar la tarea de programar tareas Map-Reduce para hacer consultas en Hadoop. Permite consultar la data usando HQL (ANSI SQL con algunas modificaciones). De esta manera, se disminuye la dificultad al obtener resultados de la data.
  • Sqoop: Permite realizar tareas de importación de datos desde diversas bases de datos relacionales, encargándose de la conversión tipos de datos y de las transformaciones que sean necesarias.
  • Spark: Desarrollado para superar las deficiencias de Map-Reduce, Spark ofrece resultados mucho mas rápidos usando el mismo cluster que Hadoop. Su mayor ventaja es que el procesamiento es en la memoria y no en el disco. Ademas, tiene sus propios módulos de SQL e Inteligencia Artificial.

Para conocer un poco mas de la historia y evolución de estas herramientas, recomiendo el siguiente articulo: https://medium.com/@markobonaci/the-history-of-hadoop