Consejos Tecnológicos

Implementación de MongoDb Map Reduce con agregación

Los algoritmos y las aplicaciones en el mercado basado en datos actual recopilan datos sobre personas, procesos, sistemas y organizaciones las 24 horas del día, los 7 días de la semana, generando cantidades masivas de datos. El problema es cómo procesar eficientemente grandes cantidades de datos sin sacrificar información valiosa.

¿Qué es la reducción de mapas?

Esta Mapa reducido El modelo de programación viene al rescate aquí. Utilizado originalmente por Google para analizar sus resultados de búsqueda, MapReduce ha ganado popularidad debido a su capacidad para dividir y procesar terabytes de datos en paralelo, lo que da como resultado resultados más rápidos.

Una(valor central) par es la unidad básica de información en MapReduce. Todos los tipos de datos estructurados y no estructurados deben transformarse en esta unidad básica antes de que los datos puedan introducirse en un modelo de MapReduce. Como sugiere el nombre, el modelo MapReduce consta de dos rutinas distintas: Map-function y Reduce-function.

MapReduce es un marco Para procesar problemas paralelizables en archivos grandes, use Una enorme cantidad Dispositivos (nodos), conocidos colectivamente como clúster (si todos los nodos están en la misma red local y usan hardware similar) o grid (si los nodos están distribuidos geográfica y administrativamente sistema, y utilizando hardware más heterogéneo).

cuando dDatos almacenados en el sistema de archivos (no estructurados)) o base de datos(estructurado) tratar con, MapReduce puede aprovechar la localidad de los datos y procesarlos cerca de la ubicación de almacenamiento para reducir los costos de comunicación.

Por lo general, un marco (o sistema) de MapReduce consta de tres operaciones:

  • Mapa: cada nodo trabajador aplica la función de mapa a los datos locales y guarda el resultado en un almacenamiento temporal. El nodo maestro procesa solo una copia de los datos de entrada redundantes.
  • Shuffle: los nodos trabajadores redistribuyen los datos en función de la clave de salida (producida por la función de mapa), lo que garantiza que todos los datos asociados con una sola clave se almacenen en el mismo nodo trabajador.
  • Reducción: cada conjunto de datos de salida ahora se procesa en paralelo por nodos trabajadores, por clave.

Este artículo lo guía paso a paso a través de las capacidades del modelo Map-Reduce.

reducción de mapaen MongoDB

La operación map-reduce ha quedado obsoleta desde MongoDB 5.0.

Las canalizaciones de agregación superan las operaciones de reducción de mapas en términos de rendimiento y disponibilidad.

Los operadores de canalización de agregación como $group, $merge, etc. se pueden usar para anular las operaciones de reducción de mapas.

Desde la versión 4.4, MongoDB Proporciona los operadores de agregación $acumulador y $función para operaciones de reducción de mapa que requieren una funcionalidad personalizada. En JavaScript, use estos operadores para crear expresiones agregadas personalizadas.

Las funciones map y reduce son las dos funciones principales aquí.

Como resultado, los datos se asignan y reducen de forma independiente en diferentes espacios, luego se combinan en la función y se guardan en la nueva colección especificada.Esta reducción de mapa() está diseñada para manejar solo grandes conjuntos de datos.Puede realizar operaciones de agregación como max y promedio Los datos se procesan con Map Reduce, es decir, como agrupar por existe sqlProcesa los datos de forma independiente y en paralelo.

Implementado usando Map Reducemongosh(Concha de MongoDB)

The db.collection.mapReduce() method in mongosh is a wrapper for the mapReduce command. The examples that follow make use of the db.collection.mapReduce(). 

ejemplo:

crear una colección Pedido Utilice estos archivos:

db.orders.insertMany([ 
   { _id: 1, cust_id: "Ishan Jain", ord_date: new Date("2021-11-01"), price: 25, items: [ { sku: "oranges", qty: 5, price: 2.5 }, { sku: "apples", qty: 5, price: 2.5 } ], status: "A" }, 
   { _id: 2, cust_id: "Ishan Jain", ord_date: new Date("2021-11-08"), price: 70, items: [ { sku: "oranges", qty: 8, price: 2.5 }, { sku: "chocolates", qty: 5, price: 10 } ], status: "A" }, 
   { _id: 3, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-08"), price: 50, items: [ { sku: "oranges", qty: 10, price: 2.5 }, { sku: "pears", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 4, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-18"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 5, cust_id: "Bhavesh Galav", ord_date: new Date("2021-11-19"), price: 50, items: [ { sku: "chocolates", qty: 5, price: 10 } ], status: "A"}, 
   { _id: 6, cust_id: "Madan Parmar", ord_date: new Date("2021-11-19"), price: 35, items: [ { sku: "carrots", qty: 10, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 7, cust_id: "Madan Parmar", ord_date: new Date("2021-11-20"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 8, cust_id: "Abhresh", ord_date: new Date("2021-11-20"), price: 75, items: [ { sku: "chocolates", qty: 5, price: 10 }, { sku: "apples", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 9, cust_id: "Abhresh", ord_date: new Date("2021-11-20"), price: 55, items: [ { sku: "carrots", qty: 5, price: 1.0 }, { sku: "apples", qty: 10, price: 2.5 }, { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" }, 
   { _id: 10, cust_id: "Abhresh", ord_date: new Date("2021-11-23"), price: 25, items: [ { sku: "oranges", qty: 10, price: 2.5 } ], status: "A" } 
]) 

Aplique una operación de reducción de mapa a la colección de pedidos para agruparlos id_cliente, luego agregue el precio de cada id_cliente:

Para procesar cada documento de entrada, defina la función de mapa:

  • esto significaEl documento que la operación map-reduce está procesando en la función.
  • Para cada documento, la función asigna el precio a id_cliente y salida id_cliente y el precio.
var mapFunction1 = function() {emit(this.cust_idthis.price);}; 

con dos argumentos keyCustId y Precio de valor, defina la función de reducción correspondiente:

  • Elementos Precio de valor La matriz son los valores de precio emitidos por la función de mapa, agrupados de la siguiente manera keyCustId.
  • Esta Precio de valor La matriz se reduce mediante esta función a la suma de sus elementos.
var reduceFunction1 = function(keyCustId, valuesPrices) {return Array.sum(valuesPrices);};

Aplique la función de mapa mapFunction1 y la función de reducción reduceFunction1 a todos los documentos en la colección de pedidos:

db.orders.mapReduce(mapFunction1,reduceFunction1,{ out: "map_reduce_example" }) 

El resultado de esta operación se guarda en map_reduce_examplerecoger. Si la colección map_reduce_example ya existe, la operación sobrescribirá su contenido con el resultado de la operación map-reduce.

Implementación de MongoDb Map Reduce con agregación

Verifique la colección map_reduce_example para verificar:

db.map_reduce_example.find().sort( { _id: 1 } ) 

Implementación de MongoDb Map Reduce con agregación

Alternativas Agregadas:

Puede anular operaciones de reducción de mapa con agregados disponibles sin definir funciones personalizadas operador de tubería:

db.orders.aggregate([{$group: { _id:"$cust_id",value:{$sum: "$price" } } },{ $out: "agg_alternative_1" }]) 

Verifique la colección agg_alternative_1 para verificar:

db.agg_alternative_1.find().sort( { _id: 1 } )

Implementación de MongoDb Map Reduce con agregación

Implementando Map Reduce en Java

Considere una colección vehículo e inserte los siguientes archivos en él.

db.car.insert( [ {car_id:"c1",name:"Audi",color:"Black",cno:"H110",mfdcountry:"Germany",speed:72,price:11.25}, {car_id:"c2",name:"Polo",color:"White",cno:"H111",mfdcountry:"Japan",speed:65,price:8.5}, {car_id:"c3",name:"Alto",color:"Silver",cno:"H112",mfdcountry:"India",speed:53,price:4.5}, {car_id:"c4",name:"Santro",color:"Grey",cno:"H113",mfdcountry:"Sweden",speed:89,price:3.5} , {car_id:"c5",name:"Zen",color:"Blue",cno:"H114",mfdcountry:"Denmark",speed:94,price:6.5} ] ) 

Obtendrá una salida como esta:

Implementación de MongoDb Map Reduce con agregación

Ahora escribamos una función de reducción de mapa en la colección de autos, agrúpelos por velocidad y clasifíquelos como autos en exceso de velocidad.

var speedmap = function (){ 
var criteria; 
if ( this.speed > 70 ) {criteria="overspeed";emit(criteria,this.speed);}}; 

En función de la velocidad del vehículo, esta función clasifica el vehículo como un vehículo con exceso de velocidad. El término «esto» se refiere al documento actual que requiere la reducción del mapa.

var avgspeed_reducemap = function(key, speed) { 
     var total =0; 
     for (var i = 0; i < speed.length; i++) { 
total = total+speed[i]; 
     } 
     return total/speed.length; 
}; 

La velocidad promedio se calcula multiplicando la velocidad total por el número de autos que circulan a alta velocidad sumando las velocidades de todos los autos a través de iteraciones de bucle.

Llame a las funciones Mapa y Reducir en todos los documentos de la colección de automóviles para llamar a la función de reducción de mapa:

var ret = db.car.mapReduce(speedmap, avgspeed_reducemap, {out: "avgspeed"}); 

La salida se guarda en la colección avgspeed. Si esta colección aún no existe, se creará; de lo contrario, se reemplazará el nuevo contenido.

Revisa el archivo:

db.avgspeed.find() 

Implementación de MongoDb Map Reduce con agregación

Esta Java programaA continuación se muestra un ejemplo del shell mongo anterior; tenga en cuenta que solo demuestra cómo funciona la función Map Reduce.

package com.journaldev.mongodb; 
 
import java.net.UnknownHostException; 
 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.DBObject; 
import com.mongodb.MapReduceCommand; 
import com.mongodb.MapReduceOutput; 
import com.mongodb.MongoClient; 
 
public class MongoDBMapReduce { 
 
public static void main(String[] args) throws UnknownHostException { 
 
// create an instance of client and establish the connection 
MongoClient m1 = new MongoClient(); 
 
// get the test db,use your own 
DB db = m1.getDB("journaldev"); 
 
// get the car collection 
DBCollection coll = db.getCollection("car"); 
 
// map function to categorize overspeed cars 
String carMap = "function (){" + "var criteria;" 
+ "if ( this.speed > 70 ) {" + "criteria="overspeed";" 
+ "emit(criteria,this.speed);" + "}" + "};"; 
 
// reduce function to add all the speed and calculate the average speed 
 
String carReduce = "function(key, speed) {" + "var total =0;" 
+ "for (var i = 0; i < speed.length; i++) {" 
+ "total = total+speed[i];" + "}" 
+ "return total/speed.length;" + "};"; 
 
// create the mapreduce command by calling map and reduce functions 
MapReduceCommand mapcmd = new MapReduceCommand(coll, carMap, carReduce, 
null, MapReduceCommand.OutputType.INLINE, null); 
 
// invoke the mapreduce command 
MapReduceOutput cars = coll.mapReduce(mapcmd); 
 
// print the average speed of cars 
for (DBObject o : cars.results()) { 
 
System.out.println(o.toString()); 
 
} 
 
} 
 
} 

producción:

{ "_id" : "overspeed" , "value" : 85.0} 

generalizar

La función de reducción se usa para operar en los datos asignados, mientras que la función de mapa se usa para agrupar todos los datos en función de pares clave-valor.

Hemos visto MapReduce como una operación. Además, completamos la implementación de mapReduce() en Mongosh y mapReduce en Java.

Las operaciones de MapReduce siempre han sido una característica confiable cuando hay una gran cantidad de datos de los cuales es necesario encontrar resultados específicos en un corto período de tiempo.

Pero con el tiempo, Google abandonó la funcionalidad de MapReduce en favor de Cloud Dataflow, que se convirtió en un reemplazo de MapReduce. Cloud Dataflow fue inventado por Google y luego de código abierto para realizar operaciones de análisis de datos en tiempo real en muchos servidores.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba