Mallorca MUG: MapReduce y Aggregation Framework

1,013 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,013
On SlideShare
0
From Embeds
0
Number of Embeds
294
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mallorca MUG: MapReduce y Aggregation Framework

  1. 1. Mallorca #MongoDB User Group http://www.meetup.com/Mallorca-MongoDB-User-Group/ MapReduce y Aggregation Framework @emiliotorrens | www.emiliotorrens.com
  2. 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. 3. Que es MapReduce?MapReduce es un Framework creado por Google para dar solución a la computación paralela sobre grandescolecciones de datos en sistemas distribuidos.Se basa en una estructura de procesos que mapean, y procesos que reducen, los primeros agrupan los datos enforma 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. 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 deOpciones donde le podemos indicar la salida, la función de finalize, los filtros etc.MAP: función que realizará el mapeoREDUCE: función que realizará la reducciónFINALIZE: función para tratar datos tras el procesoOUT: Que salida queremos darle a los datos
  5. 5. MAPLa funciona map se ejecutara una vez por cada conjunto de Documentos que cumpla con la key, en este caso elnombre 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. 6. MAPPodemos 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. 7. REDUCELa función reduce se ejecutara para todos los conjuntos de Documentos que aparezcan mas de una vez, aquí esdonde contaremos, sumaremos, etc., en key recibiremos la key que generamos anteriormente en el emit, y envalues 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. 8. SALIDAMongoDB 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. 9. EJEMPLOEjecutamos 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. 10. Que es Aggregation Framework?MongoDB Aggregation Framework proporciona un método para calcular valores agregados sin tener que usarMapReduce.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 lasproyecciones en el Aggregation Framework, puedes agregar campos calculados, crear nuevos sub-objetosvirtuales, y extraer los sub-campos en el nivel superior de los resultados.
  11. 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 terminarnos 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.
  12. 12. Ejemplodb.web_logs.aggregate( {$group: { _id: {installation:‘$installation, service:$service}, total: { $sum: 1 } , average: { $avg: $time_taken }, origins: {$addToSet: $origin} } } ,{$match: { total: {$gt: 10000} }} ,{$project: {source:$origins, _id:0, key:$_id, count:$total, average:1}} ,{$sort:{total:-1}} ,{$unwind : $source} ,{$limit:10})
  13. 13. MapReduce y Aggregation Framework en elMundo Real: Análisis de web logsEscenario:Desde una serie de servidores se parsean los logs de las peticiones web y se envían a una base de datos deMongoDB 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 cantidadde 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 conMapReduce, 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 deagregación sobre los datos ya reducidos.Demo y un poco de Código:
  14. 14. Próximos Meetups • MongoDB y .NET • Objects Mappings para MongoDB • MongoDB y Ruby on Rails
  15. 15. Mallorca #MongoDB User Group http://www.meetup.com/Mallorca-MongoDB-User-Group/ Gracias por venir ;) @emiliotorrens | www.emiliotorrens.com

×