Recuerda que puedes descargarte algunos de los ejemplos en la pestaña de Código Fuente

martes, 15 de enero de 2013

MapReduce

MapReduce es un entorno de desarrollo para el procesado de datos.
Se caracteriza por ser capaz de trabajar con grandes cantidades de datos en paralelo dentro de sistemas distribuídos encargándose de distribuir las tareas por diversos nodos del clúster.
Hay que tener en cuenta que no todos los problemas pueden ser solucionados con este framework. Por regla general se utiliza para abordar problemas de grandes cantidades de datos de hasta petabytes o exabytes de tamaño. Por esa razón MapReduce suele ejecutarse sobre el sistema de ficheros HDFS (otros sistemas de ficheros distribuídos son posibles aunque no son recomendados porque se perdería la "localización de los datos").

Sus principales características son:
  • Distribución y paralelización automáticas
  • Tolerancia a fallos
  • Disponer de herramientas de monitorización
  • Su funcionamiento interno y mantenimiento es transparente para los desarrolladores que sólo se preocupan de escribir los algoritmos, normalmente en Java. Es decir, los desarrolladores sólo tienen que programar la lógica de negocio del algoritmo y no tienen que perder el tiempo gestionando errores o parámetros de la computación distribuída.
  • Escalabilidad horizontal: Si se necesita más potencia de computación, basta con añadir más nodos en el clúster.
  • Localización de los datos: Se desplaza el algoritmo a los datos (y no lo contrario, como suele ser en sistemas distribuídos tradicionales).
Funcionamiento de MapReduce


Su ejecución consta de dos fases principales: Map y Reduce, que programa el desarrollador. Y una fase "interna" Shuffle and Sort que permite vincular las dos fases anteriores.

La fase Map

La fase Map está en contacto directo con los ficheros de entrada del programa. Consta de un método (Java) llamado map que recibe como parámetros un par de key/value (llave/valor) por cada línea de los ficheros de entrada.
Se encarga del tratamiento de cada par key/value recibido y finalmente emite cero, o más pares key/value en cada llamada.

Al escribir el método map el desarrollador puede elegir si usar o ignorar la key de entrada, ya que normalmente se trata del valor de offset de la línea.
Los pares key/value de salida no tienen por qué ser necesariamente del mismo tipo que el par de entrada.

map (input_key, input_value) -> (output_key, output_value) list


Shuffle and Sort

Una vez finalizado el Mapper, los datos intermedios se envían a través de la red para continuar con las siguientes fases.
Entre el Map y el Reduce existe una fase intermedia transparente al cliente/desarrollador llamada Shuffle and Sort.

Como su nombre indica, este proceso se encarga de ordenar por key todos los resultados emitidos por el Mapper y recoger todos los valores intermedios pertenecientes a una key y combinarlos en una lista asociada a esa key.
La lista de keys intermedias y sus valores se envía a los procesos Reducer (que puede ser uno o múltiples según la configuración realizada).

En esta fase Shuffle and Sort, todos los datos intermedios generados por el Mapper se tienen que mandar a través de la red a los Reducers, por lo tanto la red se puede transformar en un cuello de botella para los procesos MapReduce. Por eso suele ser importante intentar reducir el tamaño de esos datos intermedios a través de técnicas como compresión (Snappy), Combiner o "in-mapper combining".

La fase Reducer

La fase Reducer sólo se ejecuta a partir del momento en el que la fase del Mapper ha finalizado por completo.
Los datos intermedios generados se envían a través de la red y se escriben en disco local para que el Reducer pueda realizar su tarea. Una vez finalizado el proceso, estos datos se eliminarán.

La función reducer recibe una key y por cada key una lista de valores asociados, tras realizar las operaciones deseadas emitirá uno o más pares key/value que no tienen por qué ser del mismo tipo que los de entrada

reducer (input_key, (input_values)iterator) -> (output_key, output_value) list

Hay ciertos algoritmos donde es posible hacer trabajos "map-only" es decir, sin realizar el Reducer. Esto es muy sencillo de hacer simplemente indicando en la configuración que deseamos 0 tareas Reducer. La ventaja de un trabajo "map-only" es que sólo ejecutamos una de las tres fases vistas hasta ahora y por tanto el algoritmo se suele ejecutar más rápido.

Algunas situaciones en las que deseamos tener sólo las tareas map pueden ser para el procesado de imágenes o la conversión de formatos de fichero.


En esta otra entrada podréis ver un ejemplo teórico del MapReduce para apoyar toda esta teoría.

1 comentario:

  1. Hola Elena
    He leído en muchos sitios que con Hadoop los datos no se mueven, sino que son los procesos los que se mueven, pero ahora veo en tu blog que los datos generados por el mapper viajan a través de la red (por lo que se emplean técnicas de compresión, ...)y se graban en disco duro, luego los datos se mueven ¿verdad?
    Muchas Gracias y Saludos

    ResponderEliminar

Gracias por dejar vuestras sugerencias, dudas, críticas o comentarios en general