Antipatrones en trabajos MapReduce Hadoop

MapReduce ofrece un nuevo modelo de desarrollo, en el que por otro lado es fácil cometer errores.

Veamos algunas prácticas a evitar en trabajos MapReduce:

Demasiada caché:

Es habitual cachear datos para operaciones como JOINS de datos.

Pero este cacheo crea un overhead de memoria en Java que puede llevarnos a excepciones OutOfMemory.

Registros de entrada grandes

Qué pasa si usamos un TextInputFormat y mi línea tiene millones de caracteres?

Podemos usar la configuración de RecordReader para limitar el tamaño máximo de una línea con mapred.linerecordreader.maxlength.

Ejecución especulativa

La ejecución especulativa es un mecanismo provisto por Hadoop para cubrirnos antes nodos Map o Reduce lentos en un cluster, para eso ejecuta tareas duplicadas.

Si generamos el output con los mecanismos estándares de Hadoop no hay problemas, pero que pasa si estamos escribiendo en una base de datos por ejemplo.

En estos casos se puede deshabilitar la ejecución especulativa:

conf.set("mapred.map.tasks.speculative.execution", "false");

conf.set("mapred.reduce.tasks.speculative.execution", "false");

No controlar inputs erróneas

Nuestro código siempre debe tener en cuenta esas entradas erróneas.

Clustes con diferentes versiones de Hadoop y diferentes configuraciones

Es importante que todos las versiones y configuraciones de nuestros clusters sean lo más similares que sea posible.

Testing y de debugging con datasets grandes

Cuando estamos desarrollando y testando con MapReduce es tentador trabajar directamente con el conjunto completo de datos.

Esto afecta a la velocidad de desarrollo.

No controlar errores de parseo o lógica

Un alto porcentaje de los problemas en los Jobs se deben a entradas inesperadas.

Es importante medirlo para depurarlo fácilmente.

Demasiados contadores

Los contadores son un mecanismo para comunicar datos numéricos al Driver que corre el job, pero cada contador crea un overhead en la memoria usada en el JobTracker.

No deben por tanto usarse para cosas como crear un contador por cada input record.