MapReduce est un moyen établi de paralléliser les requêtes de données, mais cette alternative peut-elle offrir encore plus d'avantages ?

Points clés à retenir

  • MapReduce et le pipeline d'agrégation sont deux méthodes de traitement de données complexes dans MongoDB. Le cadre d'agrégation est plus récent et plus efficace.
  • MapReduce implique de spécifier des fonctions de mappage et de réduction séparées à l'aide de JavaScript, tandis que le pipeline d'agrégation utilise des opérateurs MongoDB intégrés.
  • Le pipeline d'agrégation est recommandé par MongoDB pour de meilleures performances, mais MapReduce offre plus de flexibilité et convient aux systèmes de fichiers distribués comme Hadoop.

MapReduce et le pipeline d'agrégation sont les deux méthodes que vous pouvez utiliser pour gérer le traitement complexe des données dans MongoDB. Le framework d'agrégation est plus récent et connu pour son efficacité. Mais certains développeurs préfèrent encore s'en tenir à MapReduce, qu'ils jugent plus confortable.

instagram viewer

En pratique, vous souhaitez choisir l'une de ces méthodes de requête complexes car elles atteignent le même objectif. Mais comment fonctionnent-ils? En quoi sont-ils différents et lequel devez-vous utiliser ?

Comment fonctionne MapReduce dans MongoDB

MapReduce dans MongoDB vous permet d'exécuter des calculs complexes sur un grand volume de données et d'agréger le résultat dans un bloc plus complet. La méthode MapReduce comporte deux fonctions: mapper et réduire.

Lorsque vous travaillez avec MapReduce dans MongoDB, vous spécifiez la carte et les fonctions de réduction séparément à l'aide de JavaScript et insérez chacune dans le carteRéduire requête.

La fonction de mappage divise d'abord les données entrantes en paires clé-valeur, généralement basées sur un regroupement mappé. C'est ici que vous spécifiez comment vous souhaitez regrouper les données. La fonction reduce exécute ensuite des calculs personnalisés sur les valeurs de chaque groupe de données et agrège le résultat dans une collection distincte stockée dans la base de données.

Fonctionnement du pipeline d'agrégation dans MongoDB

Le pipeline d'agrégation dans MongoDB est une alternative améliorée à MapReduce. Comme MapReduce, il vous permet d'effectuer des calculs complexes et des transformations de données directement à l'intérieur de la base de données. Mais l'agrégation ne nécessite pas l'écriture de fonctions JavaScript dédiées qui peuvent réduire les performances des requêtes.

Au lieu de cela, il utilise des opérateurs MongoDB intégrés pour manipuler, regrouper et calculer des données. Il agrège ensuite les résultats après chaque requête. Ainsi, le pipeline d'agrégation est plus personnalisable puisque vous pouvez structurer la sortie comme vous le souhaitez.

Comment les requêtes diffèrent entre MapReduce et l'agrégation

Supposons que vous souhaitiez calculer les ventes totales d'articles en fonction des catégories de produits. Dans le cas de MapReduce et de l'agrégation, les catégories de produits deviennent les clés, tandis que les sommes des éléments sous chaque catégorie deviennent les valeurs correspondantes.

Prenons un exemple de données brutes pour l'énoncé du problème décrit, qui ressemble à ceci :

Résolvons ce scénario de problème en utilisant MapReduce et un pipeline d'agrégation pour différencier leurs requêtes et les méthodes de résolution de problèmes.

La méthode MapReduce

En utilisant Python comme langage de programmation de base, le carteRéduire requête du scénario de problème décrit précédemment ressemble à ceci :

import pymongo

client = pymongo.MongoClient(
"mongodb://localhost/"
)

db = client.my_database

sales = db["sales"]

map_function =
function() {
emit(this.Section, this.Sold);
}

reduce_function =
function(key, values) {
return Array.sum(values);
}

result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)

doc = [doc for doc in db.section_totals.find()]
print(doc)

Si vous l'exécutez sur les exemples de données d'origine, vous obtiendrez une sortie comme celle-ci :

[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]

Regardez attentivement et vous devriez voir que les processeurs de carte et de réduction sont Fonctions JavaScript à l'intérieur des variables Python. Le code les transmet au carteRéduire query, qui spécifie une collection de sortie dédiée (section_totaux).

Utilisation d'un pipeline d'agrégation

En plus de donner une sortie plus fluide, la requête du pipeline d'agrégation est plus directe. Voici à quoi ressemble l'opération précédente avec le pipeline d'agrégation :

import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]

pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]

result = list(sales.aggregate(pipeline))
print(result)

L'exécution de cette requête d'agrégation donnera les résultats suivants, qui sont similaires aux résultats de l'approche MapReduce :

[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]

Performances et vitesse des requêtes

Le pipeline d'agrégation est une version mise à jour de MapReduce. MongoDB recommande d'utiliser le pipeline d'agrégation au lieu de MapReduce, car le premier est plus efficace.

Nous avons essayé d'affirmer cette affirmation lors de l'exécution des requêtes de la section précédente. Et lorsqu'il est exécuté côte à côte sur une machine de 12 Go de RAM, le pipeline d'agrégation semble être plus rapide, avec une moyenne de 0,014 seconde pendant l'exécution. Il a fallu à la même machine en moyenne 0,058 seconde pour exécuter la requête MapReduce.

Ce n'est pas un critère pour conclure sur leurs performances, mais cela semble confirmer la recommandation de MongoDB. Vous pourriez considérer ce décalage horaire comme insignifiant, mais il s'additionnera considérablement sur des milliers ou des millions de requêtes.

Les avantages et les inconvénients de MapReduce

Considérez les avantages et les inconvénients de MapReduce pour déterminer où il excelle dans le traitement des données.

Avantages

  • Cela donne plus de flexibilité pour la personnalisation puisque vous écrivez la carte et réduisez les fonctions séparément.
  • Vous pouvez facilement enregistrer la sortie dans une nouvelle collection MongoDB à l'intérieur de la base de données.
  • Vous pouvez utiliser MapReduce dans les systèmes de fichiers distribués comme Hadoop, qui s'intègre facilement à MongoDB.
  • Sa prise en charge des scripts tiers le rend plus évolutif et facile à apprendre que le pipeline d'agrégation. Ainsi, une personne ayant une formation en développement JavaScript peut implémenter MapReduce.

Les inconvénients

  • Il nécessite des scripts tiers; cela contribue à ses performances inférieures à celles du pipeline d'agrégation.
  • MapReduce peut être inefficace en termes de mémoire, nécessitant plusieurs nœuds, en particulier lorsqu'il s'agit de données trop complexes.
  • Il n'est pas adapté au traitement de données en temps réel car l'interrogation peut être lente.

Avantages et inconvénients du pipeline d'agrégation

Qu'en est-il du pipeline d'agrégation? Considérer ses forces et ses faiblesses permet de mieux comprendre.

Avantages

  • La requête est en plusieurs étapes, généralement plus courte, plus concise et plus lisible.
  • Le pipeline d'agrégation est plus efficace, offrant une amélioration significative par rapport à MapReduce.
  • Il prend en charge les opérateurs MongoDB intégrés qui vous permettent de concevoir votre requête de manière flexible.
  • Il prend en charge le traitement des données en temps réel.
  • Le pipeline d'agrégation est facilement ingérable dans MongoDB et ne nécessite pas de script tiers.
  • Tu peux créer une nouvelle collection MongoDB pour les sorties si vous avez besoin de les enregistrer.

Les inconvénients

  • Il peut ne pas être aussi flexible que MapReduce lorsqu'il s'agit de structures de données plus complexes. Comme il n'utilise pas de script tiers, il vous limite à une méthode spécifique d'agrégation de données.
  • Sa mise en œuvre et sa courbe d'apprentissage peuvent être difficiles pour les développeurs ayant peu ou pas d'expérience avec MongoDB.

Quand devriez-vous utiliser MapReduce ou Aggregation Pipeline?

En règle générale, il est préférable de tenir compte de vos besoins en matière de traitement des données lors du choix entre MapReduce et le pipeline d'agrégation.

Idéalement, si vos données sont plus complexes, nécessitant une logique et des algorithmes avancés dans un système de fichiers distribué, MapReduce peut être utile. En effet, vous pouvez facilement personnaliser les fonctions de réduction de carte et les injecter dans plusieurs nœuds. Optez pour MapReduce si votre tâche de traitement de données nécessite une évolutivité horizontale plutôt qu'une efficacité.

D'autre part, le pipeline d'agrégation est plus adapté au calcul de données complexes qui ne nécessitent pas de logique ou d'algorithmes personnalisés. Si vos données résident uniquement dans MongoDB, il est logique d'utiliser le pipeline d'agrégation car il comporte de nombreux opérateurs intégrés.

Le pipeline d'agrégation est également idéal pour le traitement des données en temps réel. Si votre exigence de calcul donne la priorité à l'efficacité par rapport à d'autres facteurs, vous souhaitez opter pour le pipeline d'agrégation.

Exécutez des calculs complexes dans MongoDB

Bien que les deux méthodes MongoDB soient des requêtes de traitement de données volumineuses, elles partagent de nombreuses différences. Au lieu de récupérer des données avant d'effectuer des calculs, ce qui peut être plus lent, les deux méthodes effectuent directement des calculs sur les données stockées dans la base de données, ce qui rend les requêtes plus efficaces.

Cependant, l'un remplace l'autre en termes de performances, et vous avez bien deviné. Le pipeline d'agrégation l'emporte sur MapReduce en termes d'efficacité et de performances. Mais bien que vous souhaitiez à tout prix remplacer MapReduce par le pipeline d'agrégation, il existe encore des domaines d'application spécifiques où l'utilisation de MapReduce a plus de sens.