jueves, 20 de marzo de 2014

Laboratorio: Desarrollando una aplicación en MapReduce

Ciclo de desarrollo de un programa en MapReduce

 

A la hora de crear un programa en MapReduce es común seguir las siguientes pautas en el desarrollo:
  1. Escribir de forma separada las funciones Map y Reduce, idealmente utilizando test independientes en cada una de ellas para comprobar que funcionan correctamente.
  2. Escribir un programa "Driver" que se encarga de configurar y correr el trabajo mapreduce ("job"). Se puede probar y depurar directamente desde el IDE con un conjunto de datos reducido trabajando en local (se pueden utilizar también test para comprobar el Driver).
  3. Una vez que el programa funciona tal y como esperábamos con este conjunto de datos reducido, ya se puede ejecutar sobre el cluster para tratar el conjunto completo de datos, donde podemos encontrarnos con otros posibles problemas no considerados en los pasos anteriores. Debugear programas que se ejecutan en un cluster es complejo, debiendo declarar "prints" para obtener logs con información sobre la ejecución de las tareas bien a través de la salida de error standar o bien con mensajes de status de las tareas. Se suelen utilizar también contadores.
En el capítulo 5 del libro "Hadoop: The definitive guide (3rd edition)" se expone un ejemplo de desarrollo de aplicación, en la que se dispone de una datos tomados por diversas estaciones meteorológicas a lo largo de cada día durante 100 años y se pretende obtener la temperatura máxima en cada uno de los años.
 

1 - Escribiendo test unitarios con MRunit

 

Se utiliza un framework estandar de testeo de la ejecución como es JUnit conjuntamente con la librería de testeo MRUnit (usada para poder pasar entradas conocidas a las funciones map y reduce y chequear que las salidas sean las esperadas).

Se escribe la primera versión de cada una de las funciones map y reduce:









Se añaden unos cuantos test con diferentes posibilidades de datos a la entrada para testearlos:












Observamos como la función map que hemos creado no funciona adecuadamente, el test falla con un tipo de datos en concreto a la entrada, lo cuál nos permite poder modificarlo para corregirlo:

La función map no pasa el test.
Tras modificar la funcion map.











2 - Corriendo un trabajo localmente con datos de test

Una vez testeadas las funciones por separado, se crea un programa Driver que configura y ejecuta el job mapreduce y se testea con un conjunto reducido de datos de entrada, en este caso con unos cuantos registros de una estación en los años 1949 y 1950.


 Al trabajar de forma local, podemos utilizar el IDE (eclipse en mi caso), para debugear paso a paso el código:

Eclipse en modo de depuración

Cuando comprobamos que funciona correctamente pasamos a compilarlo, creamos el jar y lo lanzamos en el cluster para procesar los dos primeros años (1901 y 1902) y comprobar si todo va bién:

sudo -u hdfs hadoop jar target/Capitulo_5-1.0.jar ch5.prueba_3.MaxTemperatureDriver /astwin/Ejemplo_weather /astwin/output_red


No hay comentarios:

Publicar un comentario