Hier ist der aktuelle Stand der Funktionalität für Map/Reduce in MongoDB
1) Die meisten Leistungseinschränkungen für Map/Reduce bleiben in MongoDB Version 2.2 bestehen. Die Map/Reduce-Engine erfordert weiterhin, dass jeder Datensatz von BSON in JSON konvertiert wird, die eigentlichen Berechnungen werden mithilfe der eingebetteten JavaScript-Engine durchgeführt (die langsam ist), und es gibt immer noch eine einzige globale JavaScript-Sperre, die nur einen einzigen JavaScript-Thread zulässt gleichzeitig auszuführen.
Es wurden einige inkrementelle Verbesserungen an Map/Reduce für Sharding-Cluster vorgenommen. Am bemerkenswertesten ist, dass der letzte Reduce-Vorgang jetzt auf mehrere Shards verteilt wird und die Ausgabe ebenfalls parallel fragmentiert wird.
Ich würde Map/Reduce nicht für Echtzeitaggregation in MongoDB Version 2.2 empfehlen
2) Beginnend mit MongoDB 2.2 gibt es jetzt ein neues Aggregation Framework. Dies ist eine neue Implementierung von Aggregationsoperationen, geschrieben in C++ und eng in das MongoDB-Framework integriert.
Die meisten Map/Reduce-Jobs können neu geschrieben werden, um das Aggregation Framework zu verwenden. Sie werden normalerweise schneller ausgeführt (20-fache Geschwindigkeitsverbesserung gegenüber Map/Reduce ist in Version 2.2 üblich), sie nutzen die vorhandene Abfrage-Engine vollständig aus und Sie können mehrere Aggregationsbefehle parallel ausführen.
Wenn Sie Echtzeit-Aggregationsanforderungen haben, beginnen Sie zunächst mit dem Aggregation Framework. Weitere Informationen zum Aggregationsframework finden Sie unter diesen Links:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) In der MongoDB-Version 2.4 wurden erhebliche Verbesserungen bei Map/Reduce vorgenommen. Die SpiderMonkey-JavaScript-Engine wurde durch die V8-JavaScript-Engine ersetzt, und es gibt keine globale JavaScript-Sperre mehr, was bedeutet, dass mehrere Map/Reduce-Threads gleichzeitig ausgeführt werden können.
Die Map/Reduce-Engine ist immer noch erheblich langsamer als das Aggregations-Framework, und zwar aus zwei Hauptgründen:
-
Die JavaScript-Engine wird interpretiert, während das Aggregation Framework kompilierten C++-Code ausführt
-
Die JavaScript-Engine erfordert weiterhin, dass jedes untersuchte Dokument von BSON in JSON konvertiert wird; Wenn Sie die Ausgabe in einer Sammlung speichern, muss die Ergebnismenge anschließend von JSON zurück in BSON konvertiert werden
Es gibt keine wesentlichen Änderungen in Map/Reduce zwischen 2.4 und 2.6.
Ich empfehle immer noch nicht, Map/Reduce für Echtzeit-Aggregation in MongoDB Version 2.4 oder 2.6 zu verwenden.
4) Wenn Sie Map/Reduce wirklich brauchen, können Sie sich auch den Hadoop-Adapter ansehen. Weitere Informationen finden Sie hier:
- http://www.10gen.com/presentations/webinar/mongodb-hadoop-taming-elephant-room
- http://api.mongodb.org/hadoop/MongoDB%2BHadoop+Connector.html
- http://www.mongodb.org/display/DOCS/Hadoop+Quick+Start