Map-Reduce#
Introduction à Map-reduce#
Concept#
- Map-reduce est un modèle de programmation pour traiter et générer de grands ensembles de données
- Popularisé par Google, utilisé dans divers systèmes de traitement de données massives, tels qu'Hadoop
- Divise les tâches en deux étapes principales : Map et Reduce
- Les données sont traitées en parallèle pour améliorer les performances
Avantages#
- Capacité à traiter de grandes quantités de données
- Scalabilité et distribution sur plusieurs machines
- Parallélisation des tâches pour améliorer les performances
Fonctions Map et Reduce#
Fonction Map#
- La fonction Map prend en entrée des paires clé-valeur (documents dans MongoDB)
- Applique une fonction de transformation à chaque paire clé-valeur pour produire de nouvelles paires clé-valeur intermédiaires
- Les paires clé-valeur intermédiaires sont regroupées par clé
Exemple de fonction Map dans MongoDB :
function() {
emit(this.categorie, this.valeur);
}
Fonction Reduce#
- La fonction Reduce prend en entrée les paires clé-valeur intermédiaires regroupées par clé (produites par la fonction Map)
- Applique une fonction de réduction pour fusionner les valeurs associées à chaque clé
- Génère des paires clé-valeur finales comme résultat
- Exemple de fonction Reduce dans MongoDB :
function(cle, valeurs) {
return Array.sum(valeurs);
}
Utiliser Map-reduce dans MongoDB#
- Map-reduce est implémenté dans MongoDB via la méthode
mapReduce()
- La méthode
mapReduce()
prend en arguments les fonctions Map et Reduce, ainsi que d'autres options (par exemple, le nom de la collection de sortie) - Exemple d'utilisation de Map-reduce dans MongoDB :
db.ma_collection.mapReduce(
function() { emit(this.categorie, this.valeur); },
function(cle, valeurs) { return Array.sum(valeurs); },
{
out: "resultat_map_reduce"
}
)
Finalize et options supplémentaires#
Fonction finalize (optionnelle)#
- Traite les résultats après la phase de réduction
- Exemple : calculer la moyenne des scores
Options supplémentaires#
- query : filtrer les documents avant le traitement
- sort : trier les documents avant le traitement
- limit : limiter le nombre de documents traités
- out : spécifier la collection de sortie
Exemples#
Calculer la somme des scores par utilisateur :
db.scores.mapReduce(map, reduce, { out: "sum_scores" })
Filtrer les documents avant le traitement :
db.scores.mapReduce(map, reduce, { query: { game: "chess" }, out: "chess_scores" })
Trier les documents et limiter le nombre de documents traités :
db.scores.mapReduce(map, reduce, { sort: { date: 1 }, limit: 100, out: "latest_scores" })
Comparaison entre Map-reduce et les pipelines d'agrégation#
Map-reduce#
- Plus flexible, mais plus complexe
- Convient pour les tâches distribuées et parallèles
- Performances généralement inférieures aux pipelines d'agrégation
Pipelines d'agrégation#
- Plus simples et intuitifs
- Performances généralement meilleures pour la plupart des cas d'utilisation
- Moins adaptés aux tâches distribuées et parallèles
Exemples de Map-reduce#
Calculer la somme des scores par utilisateur :#
db.scores.mapReduce(map, reduce, { out: "sum_scores" })
Filtrer les documents avant le traitement :#
db.scores.mapReduce(map, reduce, { query: { game: "chess" }, out: "chess_scores" })
Trier les documents et limiter le nombre de documents traités :#
db.scores.mapReduce(map, reduce, { sort: { date: 1 }, limit: 100, out: "latest_scores" })