Este documento presenta MapReduce y el Aggregation Framework de MongoDB. Explica cómo funcionan MapReduce y el Aggregation Framework, incluyendo ejemplos de código. También describe cómo se pueden usar MapReduce y el Aggregation Framework para analizar registros web a gran escala, reduciendo los datos cada hora y almacenándolos en colecciones particionadas por mes para consultas posteriores.
1. Mallorca #MongoDB User Group
http://www.meetup.com/Mallorca-MongoDB-User-Group/
MapReduce y Aggregation Framework
@emiliotorrens | www.emiliotorrens.com
2. Agenda MapReduce:
Que es MapReduce?
Como funciona en MongoDB?
Ejemplo
Aggregation Framework:
Que es Aggregation Framework?
Como funciona?
Ejemplo
Ejemplo en el mundo real:
Análisis de web logs
3. Que es MapReduce?
MapReduce es un Framework creado por Google para dar solución a la computación paralela sobre grandes
colecciones de datos en sistemas distribuidos.
Se basa en una estructura de procesos que mapean, y procesos que reducen, los primeros agrupan los datos en
forma de pares key/value, y los segundos los procesan.
Básicamente, MapReduce transforma una lista de pares key/value en una lista de valores.
4. Como funciona en MongoDB?
En MongoDB el método de MapReduce recibe las funciones de Map, Reduce y además se le pasa un hash de
Opciones donde le podemos indicar la salida, la función de finalize, los filtros etc.
MAP: función que realizará el mapeo
REDUCE: función que realizará la reducción
FINALIZE: función para tratar datos tras el proceso
OUT: Que salida queremos darle a los datos
5. MAP
La funciona map se ejecutara una vez por cada conjunto de Documentos que cumpla con la key, en este caso el
nombre del servidor y la hora, con emit generamos un documento con la key y los valores que queremos agregar:
function Map() {
var day = new Date(this.datetime.getFullYear(),
this.datetime.getMonth(),
this.datetime.getDate(),
this.datetime.getHours());
emit({day : day, servername: this.servername}, {count: 1});
}
6. MAP
Podemos incluir funciones de JavaScript dentro de las funciones que enviamos a MongoDB para tratar los datos:
function Map() {
function trim(str){
return str.replace(/^ss*/, '').replace(/ss*$/, '')
}
var day = new Date(this.datetime.getFullYear(),
this.datetime.getMonth(),
this.datetime.getDate(),
this.datetime.getHours());
emit({day : day, servername: trim(this.servername)}, {count: 1});
}
7. REDUCE
La función reduce se ejecutara para todos los conjuntos de Documentos que aparezcan mas de una vez, aquí es
donde contaremos, sumaremos, etc., en key recibiremos la key que generamos anteriormente en el emit, y en
values los valores:
function Reduce(key, arr_values) {
var result = {count: 0};
for(var i in arr_values) {
result.count += arr_values[i].count;
}
return result;
}
8. SALIDA
MongoDB nos da varias posibilidades de salida de los resultados:
• replace: Si no exista la colección la crea, si existe elimina todos los datos y mete los nuevos
• merge: Si la key no existe la inserta, si existe la reemplaza por la nueva
• reduce: Hace reduce sobre los datos de la colección, actualizando existentes y creando nuevos
• inline: Devuelve los datos directamente, sin guardarlos en una colección.
9. EJEMPLO
Ejecutamos MapReduce pasándole las funciones de map, reduce, los filtros y la opción de salida:
db.web_logs.mapReduce(map,
reduce,
{
out: { reduce: "web_logs_reduced" },
query: { datetime: { $lt: new Date('04/12/2012') } }
}
)
10. Que es Aggregation Framework?
MongoDB Aggregation Framework proporciona un método para calcular valores agregados sin tener que usar
MapReduce.
Aggregation Framework proporciona una funcionalidad similar a GROUP BY y operadores relacionados con SQL.
Además, proporciona capacidades de proyección para formar de nuevo los datos devueltos utilizando las
proyecciones en el Aggregation Framework, puedes agregar campos calculados, crear nuevos sub-objetos virtuales,
y extraer los sub-campos en el nivel superior de los resultados.
11. Como funciona Aggregation Framework?
El método de agregación recibe un array de comandos los cuales ira ejecutando en el lado del servidor y al terminar
nos devolverá los resultados.
Operadores:
• $project: Incluye los campos del documento original, insertar campos calculados, cambio de nombre de los
campos, crear y rellenar campos que contienen sub-documentos.
• $match: Filtra los documentos sobre los que se ejecutaran los siguientes comandos, la sintaxis es la misma que
para los Query.
• $limit: Limita el numero de documentos.
• $skip: Salta el numero indicado de documentos.
• $unwind: Aplicable solo a campos array, devuelve un documento para cada miembro del array en cada
documento de origen.
• $group: el group by.
• $sort: ordena los resultados.
13. MapReduce y Aggregation Framework en el
Mundo Real: Análisis de web logs
Escenario:
Desde una serie de servidores se parsean los logs de las peticiones web y se envían a una base de datos de
MongoDB para análisis estadístico.
Esta colección crece en +/- 6 millones de documentos al día, difícil de gestionar y difícil de consultar por la cantidad
de datos, además es difícil de mantener por el excesivo espacio que ocupan esos datos.
Solución:
Cada hora se vacía la colección de web_logs reduciendo los datos a la información estadística necesaria con
MapReduce, esta reducción se hace sobre una colección que se particiona horizontalmente por meses.
Estas nuevas colecciones se consultan con Aggregation Framework por lo que se pueden hacer operaciones de
agregación sobre los datos ya reducidos.
Demo y un poco de Código: