Hier is de huidige staat van functionaliteit voor Map/Reduce in MongoDB
1) De meeste prestatiebeperkingen voor Map/Reduce zijn nog steeds aanwezig in MongoDB versie 2.2. De Map/Reduce-engine vereist nog steeds dat elk record wordt geconverteerd van BSON naar JSON, de daadwerkelijke berekeningen worden uitgevoerd met behulp van de embedded JavaScript-engine (die traag is), en er is nog steeds een enkele globale JavaScript-vergrendeling, die slechts één enkele JavaScript-thread toestaat om in één keer te draaien.
Er zijn enkele incrementele verbeteringen aangebracht in Map/Reduce voor Sharded-clusters. Het meest opvallende is dat de laatste Reduce-bewerking nu wordt verdeeld over meerdere shards en dat de uitvoer ook parallel wordt geshard.
Ik zou Map/Reduce niet aanbevelen voor realtime aggregatie in MongoDB versie 2.2
2) Vanaf MongoDB 2.2 is er nu een nieuw aggregatieraamwerk. Dit is een nieuwe implementatie van aggregatiebewerkingen, geschreven in C++ en nauw geïntegreerd in het MongoDB-framework.
De meeste Map/Reduce-taken kunnen worden herschreven om het Aggregation Framework te gebruiken. Ze werken meestal sneller (20x snelheidsverbetering vs. Map/Reduce is gebruikelijk in versie 2.2), ze maken volledig gebruik van de bestaande query-engine en u kunt meerdere aggregatieopdrachten parallel uitvoeren.
Als u realtime aggregatievereisten heeft, moet u eerst beginnen met het aggregatieraamwerk. Bekijk deze links voor meer informatie over het aggregatieraamwerk:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) Er zijn aanzienlijke verbeteringen aangebracht in Map/Reduce in MongoDB versie 2.4. De SpiderMonkey JavaScript-engine is vervangen door de V8 JavaScript-engine en er is niet langer een algemene JavaScript-lock, wat betekent dat meerdere Map/Reduce-threads tegelijkertijd kunnen worden uitgevoerd.
De Map/Reduce-engine is nog steeds aanzienlijk langzamer dan het aggregatieraamwerk, om twee belangrijke redenen:
-
De JavaScript-engine wordt geïnterpreteerd, terwijl het Aggregation Framework gecompileerde C++-code uitvoert
-
De JavaScript-engine vereist nog steeds dat elk document dat wordt onderzocht, wordt geconverteerd van BSON naar JSON; als u de uitvoer in een verzameling opslaat, moet de resultatenset vervolgens van JSON terug naar BSON worden geconverteerd
Er zijn geen significante veranderingen in Map/Reduce tussen 2.4 en 2.6.
Ik raad het gebruik van Map/Reduce nog steeds niet aan voor realtime aggregatie in MongoDB versie 2.4 of 2.6.
4) Als je Map/Reduce echt nodig hebt, kun je ook naar de Hadoop-adapter kijken. Hier vind je meer informatie:
- 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