MapReduce
¿Qué es MapReduce?
MapReduce es un framework de ejecución distribuida basado en Java dentro del ecosistema Apache Hadoop. Elimina la complejidad de la programación distribuida al exponer dos pasos de procesamiento que los desarrolladores implementan: 1) Map y 2) Reduce. En el paso de Map, los datos se dividen entre tareas de procesamiento en paralelo. La lógica de transformación se puede aplicar a cada fragmento de datos. Una vez completada, la fase Reduce se encarga de agregar los datos del conjunto Map.. En general, MapReduce usa Hadoop Distributed File System (HDFS) tanto para la entrada como para la salida. Sin embargo, algunas tecnologías desarrolladas sobre este, como Sqoop, permiten el acceso a sistemas relacionales.
Más temas para descubrir
Historia de MapReduce
MapReduce fue desarrollado dentro de Google en 2004 por Jeffery Dean y Sanjay Ghemawat de Google (Dean & Ghemawat, 2004). En su artículo, “MAPREDUCE: SIMPLIFIED DATA PROCESSING ON LARGE CLUSTERS”, y se inspiró en las funciones map y reduce que se usan comúnmente en la programación funcional. En ese momento, el sistema MapReduce propietario de Google se ejecutaba en el Google File System (GFS). Para 2014, Google ya no usaba MapReduce como su modelo principal de procesamiento de big data. MapReduce fue alguna vez el único método mediante el cual podían recuperarse los datos almacenados en el HDFS, pero ese ya no es el caso. Actualmente, existen otros sistemas basados en consultas, como Hive y Pig, que se usan para recuperar datos del HDFS con instrucciones similares a SQL que se ejecutan junto con trabajos escritos con el modelo MapReduce.
¿Cómo funciona MapReduce?
Un sistema MapReduce suele estar compuesto por tres pasos (aunque se generaliza como la combinación de operaciones/funciones de Map y Reduce). Las operaciones de MapReduce son:
- Map: Los datos de entrada primero se dividen en bloques más pequeños. El framework de Hadoop luego decide cuántos mapeadores usar, en función del tamaño de los datos por procesar y el bloque de memoria disponible en cada servidor mapeador. Luego, cada bloque se asigna a un mapper para su procesamiento. Cada nodo “trabajador” aplica la función de mapa a los datos locales y escribe el resultado en el almacenamiento temporal. El nodo principal (maestro) se asegura de que solo se procese una única copia de los datos de entrada redundantes.
- Mezclar, combinar y particionar: los nodos trabajadores redistribuyen los datos en función de las claves de salida (producidas por la función de mapa), de modo que todos los datos que pertenecen a una clave se encuentren en el mismo nodo trabajador. Como un proceso opcional, el combinador (un reductor) puede ejecutarse individualmente en cada servidor mapeador para reducir aún más los datos en cada mapeador, lo que reduce el espacio que ocupan los datos y facilita la mezcla y el ordenamiento. La partición (no es opcional) es el proceso que decide cómo se deben presentar los datos al reductor y también los asigna a un reductor en particular.
- Reduce: Un reducer no puede comenzar mientras un mapper aún está en progreso. Los nodos de trabajo procesan cada grupo de datos de salida de pares <key,value>, en paralelo, para producir pares <key,value> como salida. Todos los valores de salida de map que tienen la misma clave se asignan a un único reductor, que luego agrega los valores para esa clave. A diferencia de la función map, que es obligatoria para filtrar y ordenar los datos iniciales, la función reduce es opcional.
¿Qué consideraciones se deben tener en cuenta con MapReduce?
Paradigma de programación rígido de MapReduce
Si bien exponer las interfaces Map y Reduce a los programadores ha simplificado la creación de aplicaciones distribuidas en Hadoop, es difícil expresar una amplia gama de lógica en un paradigma de programación de Map Reduce. El proceso iterativo es un ejemplo de lógica que no funciona bien en Map Reduce. En general, los datos no se guardan en la memoria y la lógica iterativa se maneja encadenando aplicaciones de MapReduce, lo que aumenta la complejidad.
De lectura y escritura intensiva
Los trabajos de MapReduce almacenan pocos datos en la memoria, ya que no tienen el concepto de una estructura de memoria distribuida para los datos del usuario. Los datos se deben leer y escribir en HDFS. Las aplicaciones de MapReduce más complejas implican encadenar trabajos de MapReduce más pequeños. Dado que los datos no se pueden pasar entre estos trabajos, se requerirá el uso compartido de datos a través de HDFS. Esto genera un cuello de botella de procesamiento.
Enfocado en Java
MapReduce se basa en Java y, por lo tanto, la forma más eficiente de escribir aplicaciones para él será usando java. Su código debe compilarse en un entorno de desarrollo separado y luego implementarse en el clúster de Hadoop. Este estilo de desarrollo no es muy adoptado por los analistas de datos ni por los científicos de datos que están acostumbrados a otras tecnologías como SQL o lenguajes interpretados como Python. MapReduce tiene la capacidad de invocar la lógica de Map/Reduce escrita en otros lenguajes como C, Python o Shell Scripting. Sin embargo, lo hace iniciando un proceso del sistema para gestionar la ejecución de estos programas. Esta operación introduce una sobrecarga que afectará el rendimiento del trabajo.
Descontinuado de las ofertas de Big Data
MapReduce se está eliminando gradualmente de las ofertas de Big Data. Si bien algunos proveedores aún lo incluyen en su distribución de Hadoop, lo hacen para dar soporte a aplicaciones heredadas. Los clientes han dejado de crear aplicaciones de MapReduce y, en su lugar, han adoptado frameworks más simples y rápidos, como Apache Spark.
¿Para qué se usa MapReduce?
Las aplicaciones heredadas y las herramientas nativas de Hadoop, como Sqoop y Pig, aprovechan MapReduce en la actualidad. El desarrollo de aplicaciones de MapReduce es muy limitado y tampoco se le hacen contribuciones significativas como tecnología de código abierto.
Conceptos erróneos comunes sobre MapReduce y Spark
- Acerca de MapReduce
- Acerca de Spark
Ventajas de MapReduce
- Escalabilidad
- Flexibilidad
- Seguridad y autenticación
- Procesamiento más rápido de los datos
- Modelo de programación muy simple
- Disponibilidad y resiliencia
Consejos simples sobre cómo mejorar el rendimiento de MapReduce
- Habilitando el modo uber
- Usar biblioteca nativa
- Aumentar el tamaño del bloque
- Monitorea el tiempo que tardan las tareas map
- Identificar si la compresión de datos es divisible o no
- Establecer el número de tareas de reducción
- Analiza la partición de los datos
- Movimientos de rendimiento de la fase de shuffle
- Optimizar el código de MapReduce
MapReduce vs. Databricks Delta Engine
El Databricks Delta Engine se basa en Apache Spark y un motor de C++ llamado Photon. Esto permite la flexibilidad del procesamiento de DAG de la que carece MapReduce, la velocidad del procesamiento en memoria y un motor especializado y compilado de forma nativa que proporciona tiempos de respuesta a las consultas increíblemente rápidos. Los usuarios pueden interactuar con Databricks Delta Engine usando Python, Scala, R o SQL. Las aplicaciones de Spark existentes pueden modificarse para usar el Delta Engine con un simple cambio de línea, es decir, especificando “delta” como el formato de datos. MapReduce y HDFS no admiten de forma nativa la consistencia transaccional de los datos ni la capacidad de actualizar/eliminar datos existentes dentro de los conjuntos de datos. El Delta Engine permite el acceso simultáneo a los datos por parte de los productores y consumidores de datos, y también proporciona capacidades CRUD completas. Finalmente, MapReduce no posee capacidades integradas para manejar archivos pequeños, un problema común en cualquier entorno de big data. Databricks Delta Engine cuenta con compactación automática que optimiza el tamaño de los datos guardados en el almacenamiento. También tiene un comando OPTIMIZE que puede compactar archivos bajo demanda. Con la función de consistencia transaccional de Delta, esta operación se puede realizar mientras los usuarios finales o las aplicaciones acceden a los datos.
Las cinco mejores alternativas a MapReduce
- Apache Spark™
- Apache Storm
- Ceph
- Hydra
- Google BigQuery


