MapReduce ist eine etablierte Methode zur Parallelisierung von Datenabfragen, aber kann diese Alternative noch mehr Vorteile bieten?
Die zentralen Thesen
- MapReduce und die Aggregation Pipeline sind zwei Methoden zur komplexen Datenverarbeitung in MongoDB. Das Aggregationsframework ist neuer und effizienter.
- MapReduce umfasst die Angabe separater Karten- und Reduzierungsfunktionen mithilfe von JavaScript, während die Aggregationspipeline integrierte MongoDB-Operatoren verwendet.
- Die Aggregationspipeline wird von MongoDB für eine bessere Leistung empfohlen, MapReduce bietet jedoch mehr Flexibilität und ist für verteilte Dateisysteme wie Hadoop geeignet.
MapReduce und die Aggregation-Pipeline sind die beiden Methoden, mit denen Sie die komplexe Datenverarbeitung in MongoDB bewältigen können. Das Aggregationsframework ist neuer und für seine Effizienz bekannt. Einige Entwickler bleiben jedoch immer noch lieber bei MapReduce, das sie für komfortabler halten.
Praktischerweise möchten Sie eine dieser komplexen Abfragemethoden auswählen, da sie das gleiche Ziel erreichen. Aber wie funktionieren sie? Wie unterscheiden sie sich und welche sollten Sie verwenden?
So funktioniert MapReduce in MongoDB
Mit MapReduce in MongoDB können Sie komplexe Berechnungen für große Datenmengen durchführen und das Ergebnis zu einem umfassenderen Block zusammenfassen. Die MapReduce-Methode verfügt über zwei Funktionen: Map und Reduce.
Während Sie mit MapReduce in MongoDB arbeiten, geben Sie die Map- und Reduce-Funktionen mithilfe von JavaScript separat an und fügen sie jeweils in die integrierte Funktion ein Karte verkleinern Abfrage.
Die Kartenfunktion teilt zunächst die eingehenden Daten in Schlüssel-Wert-Paare auf – normalerweise basierend auf einer zugeordneten Gruppierung. Hier legen Sie fest, wie Sie die Daten gruppieren möchten. Die Reduzierungsfunktion führt dann benutzerdefinierte Berechnungen für die Werte in jeder Datengruppe durch und aggregiert das Ergebnis in einer separaten Sammlung, die in der Datenbank gespeichert wird.
So funktioniert die Aggregationspipeline in MongoDB
Die Aggregationspipeline in MongoDB ist eine verbesserte Alternative zu MapReduce. Wie MapReduce ermöglicht es Ihnen, komplexe Berechnungen und Datentransformationen direkt in der Datenbank durchzuführen. Für die Aggregation ist es jedoch nicht erforderlich, dedizierte JavaScript-Funktionen zu schreiben, die die Abfrageleistung beeinträchtigen können.
Stattdessen werden integrierte MongoDB-Operatoren zum Bearbeiten, Gruppieren und Berechnen von Daten verwendet. Anschließend werden die Ergebnisse nach jeder Abfrage zusammengefasst. Dadurch ist die Aggregationspipeline besser anpassbar, da Sie die Ausgabe nach Ihren Wünschen strukturieren können.
Wie sich Abfragen zwischen MapReduce und Aggregation unterscheiden
Angenommen, Sie möchten den Gesamtumsatz von Artikeln basierend auf Produktkategorien berechnen. Im Fall von MapReduce und Aggregation werden die Produktkategorien zu Schlüsseln, während die Summen der Elemente unter jeder Kategorie zu den entsprechenden Werten werden.
Nehmen Sie einige Beispiel-Rohdaten für die beschriebene Problemstellung, die wie folgt aussehen:
Lassen Sie uns dieses Problemszenario mithilfe von MapReduce und einer Aggregationspipeline lösen, um zwischen ihren Abfragen und Problemlösungsmethoden zu unterscheiden.
Die MapReduce-Methode
Unter Verwendung von Python als Basisprogrammiersprache ist die Karte verkleinern Die Abfrage des zuvor beschriebenen Problemszenarios sieht folgendermaßen aus:
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)
Wenn Sie dies mit den ursprünglichen Beispieldaten ausführen, erhalten Sie eine Ausgabe wie diese:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Schauen Sie genau hin und Sie sollten sehen, dass die Karte und die Prozessoren reduziert sind JavaScript-Funktionen innerhalb von Python-Variablen. Der Code übergibt diese an die Karte verkleinern Abfrage, die eine dedizierte Ausgabesammlung angibt (section_totals).
Verwenden einer Aggregationspipeline
Die Aggregationspipeline-Abfrage liefert nicht nur eine glattere Ausgabe, sondern ist auch direkter. So sieht der vorherige Vorgang mit der Aggregationspipeline aus:
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)
Das Ausführen dieser Aggregationsabfrage führt zu den folgenden Ergebnissen, die den Ergebnissen des MapReduce-Ansatzes ähneln:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Abfrageleistung und -geschwindigkeit
Die Aggregationspipeline ist eine aktualisierte Version von MapReduce. MongoDB empfiehlt die Verwendung der Aggregationspipeline anstelle von MapReduce, da erstere effizienter ist.
Wir haben versucht, diesen Anspruch geltend zu machen, während wir die Abfragen im vorherigen Abschnitt ausgeführt haben. Und bei der parallelen Ausführung auf einer 12-GB-RAM-Maschine schien die Aggregationspipeline schneller zu sein und betrug durchschnittlich 0,014 Sekunden während der Ausführung. Die Ausführung der MapReduce-Abfrage dauerte auf derselben Maschine durchschnittlich 0,058 Sekunden.
Das ist kein Maßstab für ihre Leistungen, aber es scheint die Empfehlung von MongoDB zu untermauern. Sie mögen diesen Zeitunterschied als unbedeutend betrachten, aber er summiert sich bei Tausenden oder Millionen von Abfragen erheblich.
Die Vor- und Nachteile von MapReduce
Berücksichtigen Sie die Vor- und Nachteile von MapReduce, um festzustellen, wo es sich in der Datenverarbeitung auszeichnet.
Vorteile
- Es bietet mehr Flexibilität bei der Anpassung, da Sie die Karte schreiben und die Funktionen separat reduzieren.
- Sie können die Ausgabe problemlos in einer neuen MongoDB-Sammlung innerhalb der Datenbank speichern.
- Sie können verwenden MapReduce in verteilten Dateisystemen wie Hadoop, das sich problemlos in MongoDB integrieren lässt.
- Durch die Unterstützung von Skripten von Drittanbietern ist es skalierbarer und leichter zu erlernen als die Aggregationspipeline. Daher kann jemand mit einem Hintergrund in der JavaScript-Entwicklung MapReduce implementieren.
Nachteile
- Es erfordert Skripting von Drittanbietern; Dies trägt zu einer geringeren Leistung als die Aggregationspipeline bei.
- MapReduce kann speicherineffizient sein und mehrere Knoten erfordern, insbesondere wenn es um übermäßig komplexe Daten geht.
- Für die Datenverarbeitung in Echtzeit ist es nicht geeignet, da die Abfrage langsam sein kann.
Vor- und Nachteile der Aggregation Pipeline
Wie wäre es mit der Aggregationspipeline? Die Berücksichtigung seiner Stärken und Schwächen liefert weitere Einblicke.
Vorteile
- Die Abfrage ist mehrstufig, in der Regel kürzer, prägnanter und besser lesbar.
- Die Aggregationspipeline ist effizienter und bietet eine deutliche Verbesserung gegenüber MapReduce.
- Es unterstützt integrierte MongoDB-Operatoren, mit denen Sie Ihre Abfrage flexibel gestalten können.
- Es unterstützt die Datenverarbeitung in Echtzeit.
- Die Aggregationspipeline lässt sich problemlos in MongoDB integrieren und erfordert kein Skripting von Drittanbietern.
- Du kannst Erstellen Sie eine neue MongoDB-Sammlung für die Ausgaben, wenn Sie sie speichern müssen.
Nachteile
- Beim Umgang mit komplexeren Datenstrukturen ist es möglicherweise nicht so flexibel wie MapReduce. Da kein Skripting von Drittanbietern verwendet wird, sind Sie auf eine bestimmte Methode zum Aggregieren von Daten beschränkt.
- Die Implementierung und Lernkurve kann für Entwickler mit wenig oder keiner Erfahrung mit MongoDB eine Herausforderung sein.
Wann sollten Sie MapReduce oder Aggregation Pipeline verwenden?
Im Allgemeinen ist es am besten, Ihre Datenverarbeitungsanforderungen zu berücksichtigen, wenn Sie zwischen MapReduce und der Aggregationspipeline wählen.
Wenn Ihre Daten komplexer sind und erweiterte Logik und Algorithmen in einem verteilten Dateisystem erfordern, kann MapReduce im Idealfall nützlich sein. Dies liegt daran, dass Sie Map-Reduction-Funktionen problemlos anpassen und in mehrere Knoten einfügen können. Entscheiden Sie sich für MapReduce, wenn Ihre Datenverarbeitungsaufgabe horizontale Skalierbarkeit wichtiger ist als Effizienz.
Andererseits eignet sich die Aggregationspipeline besser für die Berechnung komplexer Daten, die keine benutzerdefinierte Logik oder Algorithmen erfordern. Wenn sich Ihre Daten nur in MongoDB befinden, ist es sinnvoll, die Aggregationspipeline zu verwenden, da sie über viele integrierte Operatoren verfügt.
Die Aggregationspipeline eignet sich auch am besten für die Datenverarbeitung in Echtzeit. Wenn Ihre Rechenanforderung der Effizienz Vorrang vor anderen Faktoren einräumt, sollten Sie sich für die Aggregationspipeline entscheiden.
Führen Sie komplexe Berechnungen in MongoDB aus
Obwohl es sich bei beiden MongoDB-Methoden um Big-Data-Verarbeitungsabfragen handelt, weisen sie viele Unterschiede auf. Anstatt Daten vor der Durchführung von Berechnungen abzurufen, was langsamer sein kann, führen beide Methoden Berechnungen direkt anhand der in der Datenbank gespeicherten Daten durch, wodurch Abfragen effizienter werden.
Allerdings übertrifft das eine das andere in der Leistung, und Sie haben richtig geraten. Die Aggregationspipeline übertrifft MapReduce in Bezug auf Effizienz und Leistung. Auch wenn Sie MapReduce unbedingt durch die Aggregation-Pipeline ersetzen möchten, gibt es dennoch bestimmte Anwendungsbereiche, in denen der Einsatz von MapReduce sinnvoller ist.