MapReduce es una forma establecida de paralelizar consultas de datos, pero ¿puede esta alternativa ofrecer aún más beneficios?
Conclusiones clave
- MapReduce y la canalización de agregación son dos métodos para el procesamiento de datos complejos en MongoDB. El marco de agregación es más nuevo y más eficiente.
- MapReduce implica especificar funciones separadas de mapa y reducción mediante JavaScript, mientras que la canalización de agregación utiliza operadores integrados de MongoDB.
- MongoDB recomienda la canalización de agregación para un mejor rendimiento, pero MapReduce ofrece más flexibilidad y es adecuado para sistemas de archivos distribuidos como Hadoop.
MapReduce y la tubería de agregación son los dos métodos que puede usar para manejar el procesamiento de datos complejos en MongoDB. El marco de agregación es más nuevo y conocido por su eficiencia. Pero algunos desarrolladores aún prefieren apegarse a MapReduce, que consideran más cómodo.
En la práctica, desea elegir uno de estos métodos de consulta complejos, ya que logran el mismo objetivo. Pero, como trabajan? ¿En qué se diferencian y cuál debería usar?
Cómo funciona MapReduce en MongoDB
MapReduce en MongoDB le permite ejecutar cálculos complejos en un gran volumen de datos y agregar el resultado en una porción más completa. El método MapReduce presenta dos funciones: mapear y reducir.
Mientras trabaja con MapReduce en MongoDB, especificará el mapa y las funciones de reducción por separado usando JavaScript e insertará cada una en el Mapa reducido consulta.
La función de mapa primero divide los datos entrantes en pares clave-valor, generalmente en función de la agrupación asignada. Aquí es donde especifica cómo desea agrupar los datos. La función reduce luego ejecuta cálculos personalizados sobre los valores en cada grupo de datos y agrega el resultado en una colección separada almacenada en la base de datos.
Cómo funciona la tubería de agregación en MongoDB
La tubería de agregación en MongoDB es una alternativa mejorada a MapReduce. Al igual que MapReduce, le permite realizar cálculos complejos y transformaciones de datos directamente dentro de la base de datos. Pero la agregación no requiere escribir funciones de JavaScript dedicadas que puedan reducir el rendimiento de las consultas.
En su lugar, utiliza operadores MongoDB integrados para manipular, agrupar y calcular datos. Luego agrega los resultados después de cada consulta. Por lo tanto, la tubería de agregación es más personalizable ya que puede estructurar la salida como desee.
Cómo difieren las consultas entre MapReduce y Aggregation
Suponga que desea calcular las ventas totales de artículos en función de las categorías de productos. En el caso de MapReduce y la agregación, las categorías de productos se convierten en las claves, mientras que las sumas de los elementos de cada categoría se convierten en los valores correspondientes.
Tome algunos datos sin procesar de ejemplo para la declaración del problema descrita, que se ve así:
Resolvamos este escenario problemático usando MapReduce y una canalización de agregación para diferenciar entre sus consultas y métodos de resolución de problemas.
El método MapReduce
Utilizando Python como lenguaje de programación base, el Mapa reducido La consulta del escenario del problema descrito anteriormente tiene este aspecto:
import pymongo
client = pymongo.MongoClient(
"mongodb://localhost/"
)db = client.my_database
sales = db["sales"]
map_function =
function() {
emit(this.Section, this.Sold);
}reduce_function =
function(key, values) {
return Array.sum(values);
}result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)
doc = [doc for doc in db.section_totals.find()]
print(doc)
Si ejecuta esto contra los datos de muestra originales, verá un resultado como este:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Mire de cerca, y debería ver que los procesadores map y reduce están Funciones JavaScript dentro de las variables de Python. El código pasa estos al Mapa reducido consulta, que especifica una colección de salida dedicada (sección_totales).
Uso de una canalización de agregación
Además de brindar una salida más fluida, la consulta de canalización de agregación es más directa. Así es como se ve la operación anterior con la canalización de agregación:
import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]
result = list(sales.aggregate(pipeline))
print(result)
Ejecutar esta consulta de agregación dará los siguientes resultados, que son similares a los resultados del enfoque de MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Consulta de rendimiento y velocidad
La canalización de agregación es una versión actualizada de MapReduce. MongoDB recomienda usar la tubería de agregación en lugar de MapReduce, ya que la primera es más eficiente.
Intentamos hacer valer esta afirmación mientras ejecutamos las consultas en la sección anterior. Y cuando se ejecutó en paralelo en una máquina de 12 GB de RAM, la canalización de agregación pareció ser más rápida, con un promedio de 0,014 segundos durante la ejecución. La misma máquina tardó un promedio de 0,058 segundos en ejecutar la consulta de MapReduce.
Ese no es un criterio para concluir sobre sus actuaciones, pero parece respaldar la recomendación de MongoDB. Puede considerar que esta diferencia horaria es insignificante, pero se acumulará considerablemente en miles o millones de consultas.
Los pros y los contras de MapReduce
Considere las ventajas y desventajas de MapReduce para determinar dónde sobresale en el procesamiento de datos.
ventajas
- Brinda más flexibilidad para la personalización ya que escribe el mapa y reduce las funciones por separado.
- Puede guardar fácilmente la salida en una nueva colección MongoDB dentro de la base de datos.
- Puedes usar MapReduce en sistemas de archivos distribuidos como Hadoop, que se integra fácilmente con MongoDB.
- Su compatibilidad con secuencias de comandos de terceros lo hace más escalable y fácil de aprender que la canalización de agregación. Entonces, alguien con experiencia en desarrollo de JavaScript puede implementar MapReduce.
Contras
- Requiere secuencias de comandos de terceros; esto contribuye a su rendimiento inferior al de la canalización de agregación.
- MapReduce puede ser ineficiente para la memoria y requerir varios nodos, especialmente cuando se trata de datos demasiado complejos.
- No es adecuado para el procesamiento de datos en tiempo real, ya que las consultas pueden ser lentas.
Pros y contras de la canalización de agregación
¿Qué hay de la canalización de agregación? Tener en cuenta sus fortalezas y debilidades proporciona más información.
ventajas
- La consulta es de varias etapas, generalmente más corta, más concisa y más legible.
- La canalización de agregación es más eficiente y ofrece una mejora significativa con respecto a MapReduce.
- Admite operadores MongoDB integrados que le permiten diseñar su consulta de manera flexible.
- Es compatible con el procesamiento de datos en tiempo real.
- La canalización de agregación es fácilmente ingerible en MongoDB y no requiere secuencias de comandos de terceros.
- Puede crear una nueva colección MongoDB para las salidas si necesita guardarlas.
Contras
- Puede que no sea tan flexible como MapReduce cuando se trata de estructuras de datos más complejas. Dado que no utiliza secuencias de comandos de terceros, lo limita a un método específico para agregar datos.
- Su curva de implementación y aprendizaje puede ser un desafío para los desarrolladores con poca o ninguna experiencia con MongoDB.
¿Cuándo debería usar MapReduce o Aggregation Pipeline?
Por lo general, es mejor tener en cuenta los requisitos de procesamiento de datos al elegir entre MapReduce y la canalización de agregación.
Idealmente, si sus datos son más complejos y requieren lógica y algoritmos avanzados en un sistema de archivos distribuido, MapReduce puede ser útil. Esto se debe a que puede personalizar fácilmente las funciones de reducción de mapas e inyectarlas en varios nodos. Elija MapReduce si su tarea de procesamiento de datos requiere escalabilidad horizontal sobre eficiencia.
Por otro lado, la canalización de agregación es más adecuada para calcular datos complejos que no requieren lógica o algoritmos personalizados. Si sus datos residen solo en MongoDB, tiene sentido usar la canalización de agregación, ya que cuenta con muchos operadores integrados.
La canalización de agregación también es mejor para el procesamiento de datos en tiempo real. Si su requisito de computación prioriza la eficiencia sobre otros factores, desea optar por la canalización de agregación.
Ejecute cálculos complejos en MongoDB
Aunque ambos métodos de MongoDB son consultas de procesamiento de big data, comparten muchas diferencias. En lugar de recuperar datos antes de realizar los cálculos, que pueden ser más lentos, ambos métodos realizan cálculos directamente sobre los datos almacenados en la base de datos, lo que hace que las consultas sean más eficientes.
Sin embargo, uno reemplaza al otro en rendimiento, y acertaste. La canalización de agregación supera a MapReduce en eficiencia y rendimiento. Pero si bien es posible que desee reemplazar MapReduce con la canalización de agregación a toda costa, todavía hay áreas específicas de aplicación donde el uso de MapReduce tiene más sentido.