Ejecuta procesos de Hadoop MapReduce sin empaquetar el .jar (directamente desde el Eclipse). También con depuración.

Esta información puede resultar de interés general, pero especialmente a aquellos que, como yo, estáis cursando el Máster en Business Analytics y Big Data UCJC de IMF Business School, en el caso de que no trabajéis habitualmente con Java.

Para avanzar con el contenido del Módulo "Infraestructura Big Data", como parte de la Unidad 3 (Procesamiento de datos con Hadoop), debemos ejecutar y comprender en profundidad los ejemplos de MapReduce. Ya sabes, WordCount, LineCount y demás.

Tal como apunta el Capítulo 11 (11.6.2.3) de la Unidad 3, una forma de ejecutar el ejemplo es empaquetar el código java en un jar y ejecutarlo desde línea de comando.

Como desarrollador de aplicaciones Java (entre otros roles), yo estoy acostumbrado a usar el depurador de Eclipse. Ya sé, el depurador te "aburguesa", te hace débil, etc... Pero me parece interesante el uso del depurador en este caso que estamos aprendiendo MapReduce, creo que es una forma fácil de inspeccionar los objetos, parámetros, y seguir la ejecución.

Si empaquetamos el código y lo ejecutamos desde línea de comandos, no podemos seguirlo en depuración, a menos que configuremos hadoop para levantar el puerto de depuración, y configuremos Eclipse para conectarse a él como aplicación Java remota... todo esto dista mucho de las capacidades que tiene una persona no habituada a desarrollar con Java, Eclipse, etc... esto es a batallar diariamente con las peculiaridades de la JVM.

Para estas personas, creo que puede ser interesante seguir el ejemplo en depuración, directamente desde Eclipse, sin ninguna complicación. Además, se ahorra tiempo.

Para poder ejecutar el proceso directamente desde eclipse, sin empaquetar, únicamente tenemos que agregar una línea al código del ejemplo

conf.set("fs.defaultFS", "hdfs://localhost:9000/");

entre la creación de la Configuration y la del Job.

Se indica el host (en mi caso, puesto que estoy ejecutando Eclipse en local, en el Ubuntu, es "localhost") y puerto donde se encuentra levantado hadoop.

Queda así:

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9000/");   
Job job = Job.getInstance(conf, "word count");

Con esta modificación, ya no es necesario empaquetar el .jar ni posteriormente ejecutar desde línea de comando. Para correr el ejemplo, simplemente crear una "Run Configuration" en Eclipse y click en botón "Run".

New Run Configuration

Run Configuration - Program arguments

¿Para correr el ejemplo en depuración? Simple. Crear una "Debug Configuration" en Eclipse y click en botón "Debug".

New Debug Configuration

Debug Configuration - Program arguments

Con ello ya podemos poner puntos de ruptura, inspeccionar los objetos y, en definitiva, tener una vista cómoda del ciclo de ejecución.

Si tienes alguna duda, no dudes en ponerte en contacto, intentaré resolvértela via mail en cuanto tenga tiempo, o en el peor de los casos, si se pone difícil, podría echarte una mano vía TeamViewer.

Espero que pueda servir de ayuda a alguien. Voy a continuar con mis ejemplos de MapReduce. Suerte con los tuyos.

Alberto Morales Morales

Software craftsman. Passion for developing quality code that can be proud of. Happily married.

Madrid, Spain.