Aller au contenu

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" })