Här är det aktuella funktionsläget för Map/Reduce i MongoDB
1) De flesta av prestandabegränsningarna för Map/Reduce finns fortfarande kvar i MongoDB version 2.2. Map/Reduce-motorn kräver fortfarande att varje post konverteras från BSON till JSON, de faktiska beräkningarna utförs med den inbäddade JavaScript-motorn (som är långsam), och det finns fortfarande ett enda globalt JavaScript-lås som bara tillåter en enda JavaScript-tråd att köra på en enda gång.
Det har gjorts några stegvisa förbättringar av Map/Reduce för sönderdelade kluster. Mest anmärkningsvärt är att den slutliga Reduce-operationen nu är fördelad över flera skärvor, och utdata skärs också parallellt.
Jag skulle inte rekommendera Map/Reduce för realtidsaggregation i MongoDB version 2.2
2) Från och med MongoDB 2.2 finns det nu ett nytt aggregationsramverk. Detta är en ny implementering av aggregeringsoperationer, skriven i C++ och tätt integrerad i MongoDB-ramverket.
De flesta Map/Reduce-jobb kan skrivas om för att använda Aggregation Framework. De körs vanligtvis snabbare (20x hastighetsförbättring jämfört med Map/Reduce är vanligt i version 2.2), de utnyttjar den befintliga frågemotorn fullt ut och du kan köra flera aggregeringskommandon parallellt.
Om du har aggregeringskrav i realtid är det första stället att börja med aggregeringsramverket. För mer information om aggregeringsramverket, ta en titt på dessa länkar:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) Det har skett betydande förbättringar i Map/Reduce i MongoDB version 2.4. SpiderMonkey JavaScript-motorn har ersatts av V8 JavaScript-motorn och det finns inte längre något globalt JavaScript-lås, vilket innebär att flera Map/Reduce-trådar kan köras samtidigt.
Map/Reduce-motorn är fortfarande betydligt långsammare än aggregeringsramverket, av två huvudsakliga skäl:
-
JavaScript-motorn tolkas, medan Aggregation Framework kör kompilerad C++-kod
-
JavaScript-motorn kräver fortfarande att varje dokument som granskas konverteras från BSON till JSON; om du sparar utdata i en samling måste resultatuppsättningen sedan konverteras från JSON tillbaka till BSON
Det finns inga betydande förändringar i Map/Reduce mellan 2.4 och 2.6.
Jag rekommenderar fortfarande inte att du använder Map/Reduce för realtidsaggregation i MongoDB version 2.4 eller 2.6.
4) Om du verkligen behöver Map/Reduce kan du också titta på Hadoop Adaptor. Det finns mer information här:
- 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