Testing de Hadoop con MRUnit

0
6069

Testing de Hadoop con MRUnit

 

0. Índice de contenidos.

1. Introducción.

Para hacer test unitarios de algoritmos Map Reduce disponemos de la librería Apache MRUnit, una librería orientada a probar algoritmos Map Reduce de Hadoop que se integra con JUnit. Para asegurarnos que los cambios futuros en el software no rompen nada de lo que ya funciona, debemos hacer test automáticos de manera que el ciclo de vida asegure que se ponen en verde la batería de tests con cada cambio nuevo que se introduzca.

Por ello no debería ser una recomendación sino una obligación dejar probado con tests unitarios que nuestro código hace lo que debe ya que si mañana alguien o nosotros mismos metemos cualquier cambio en el algoritmo, nos aseguremos que todo sigue funcionando perfectamente.

En este tutorial vamos a hacer test unitarios y de integración para probar cómo funciona MRUnit.

Puedes descargarte el código del tutorial desde mi repositorio de github pinchando aquí.

2. Entorno.

El tutorial se ha realizado con el siguiente entorno:

  • Ubuntu 12.04 64 bits
  • Oracle Java SDK 1.6.0_27
  • Apache Hadoop 2.2.0
  • MRUnit 1.0.0
  • Apache Maven 3.1.1

3. Configuración del proyecto

Partiremos del proyecto que creamos en este tutorial. Teníamos un algoritmo MapReduce que procesaba un fichero con datos climatológicos donde el resultado era la agrupación de los datos históricos por uno de los índices de polución por cada provincia de Castilla y León. Ahora vamos a hacer tests con MRUnit para asegurar que nuestro algoritmo funciona correctamente. El desarrollo lógico habría sido hacer el test junto al código y no después aunque nunca es tarde 😛

Aunque lógicamente podemos testear las clases con JUnit y mockear las clases de Hadoop con Mockito por ejemplo, MRUnit nos facilita mucho el trabajo ya que nos proporciona drivers específicos para el mapper y el reducer. También dispone de un driver para hacer tests de integración y poder probar las clases en conjunto.

Para empezar añadimos al pom.xml las librerías de JUnit y MRUnit.

Importante!! Hay que indicarle en el classifier la versión de Hadoop que tenemos instalada.

4. Tests unitarios.

Para las pruebas del mapper, MRUnit nos proporciona la clase MapDriver. En nuestro test debemos crear una instancia de esta clase pasándole en el constructor el mapper que queremos probar. Para el reducer existe un driver similar.

En el test debemos configurar la entrada y salida del MapDriver con los métodos withInput indicando los datos de entrada al mapper y withOutput con la salida esperada. Lanzamos el test llamando al método runTest el cuál llamará al método map de nuestro mapper pasándole en la entrada los datos que metimos en el withInput. Si la salida del mapper no corresponde con lo que metimos en el método withOutput se lanzará una AssertionError haciendo fallar el test.

Otra opción si queremos recuperar la salida del mapper es utilizar el método run() del mapDriver. Este método ejecutará la tarea Map y nos devolverá el resultado para que seamos nosotros quienes evaluemos el resultado. Los tests del reducer son muy similares.

5. Tests de integración.

Una vez probados el mapper y el reducer por separado vamos a hacer un test de integración que pruebe todo en conjunto. El funcionamiento es similar al anterior, creamos un mapReduceDriver configurando la entrada y el resultado esperado para la salida. Probaremos varios casos, con datos buenos y malos y varios tipos de salida.

Si todo ha ido bien se pondrán en verde nuestros tests y lo mejor, que al quedar integrados en el ciclo de vida de nuestro proyecto nos aseguramos que todo seguirá funcionando.

6. Conclusiones.

Como véis, hacer tests de algoritmos MapReduce es muy sencillo si tienes las herramientas adecuadas. Conociendo JUnit te resultará muy sencillo utilizar MRUnit ya que su funcionamiento es similar.

Puedes descargarte el código del tutorial desde mi repositorio de github pinchando aquí.

Espero que te haya sido de ayuda.

Un saludo.

Juan

Dejar respuesta

Please enter your comment!
Please enter your name here