Ето текущото състояние на функционалност за Map/Reduce в MongoDB
1) Повечето от ограниченията на производителността за Map/Reduce все още остават в MongoDB версия 2.2. Машината Map/Reduce все още изисква всеки запис да се преобразува от BSON в JSON, действителните изчисления се извършват с помощта на вградения JavaScript двигател (което е бавно) и все още има едно глобално заключване на JavaScript, което позволява само една нишка на JavaScript да се изпълнява наведнъж.
Имаше някои постепенни подобрения на Map/Reduce за разчленени клъстери. Най-важното е, че окончателната операция Reduce вече се разпределя между множество фрагменти, а изходът също се разделя паралелно.
Не бих препоръчал Map/Reduce за агрегиране в реално време в MongoDB версия 2.2
2) Започвайки с MongoDB 2.2, вече има нова рамка за агрегиране. Това е нова реализация на операции за агрегиране, написана на C++ и тясно интегрирана в рамката на MongoDB.
Повечето задачи за карти/намаляване могат да бъдат пренаписани, за да се използва рамката за агрегиране. Те обикновено работят по-бързо (20x подобрение на скоростта спрямо Map/Reduce е често срещано във версия 2.2), те използват пълноценно съществуващата машина за заявки и можете да изпълнявате паралелно множество команди за агрегиране.
Ако имате изисквания за агрегиране в реално време, първото място, от което да започнете, е с рамката за агрегиране. За повече информация относно рамката за агрегиране, разгледайте тези връзки:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) Имаше значителни подобрения в Map/Reduce в MongoDB версия 2.4. JavaScript двигателът SpiderMonkey е заменен от V8 JavaScript двигател и вече няма глобално заключване на JavaScript, което означава, че няколко нишки Map/Reduce могат да се изпълняват едновременно.
Машината Map/Reduce все още е значително по-бавна от рамката за агрегиране поради две основни причини:
-
Машината на JavaScript се интерпретира, докато Aggregation Frameworkruns компилира C++ код
-
JavaScript двигателят все още изисква всеки документ, който се разглежда, да бъде конвертиран от BSON в JSON; ако запазвате изхода в колекция, резултатният набор трябва да бъде преобразуван от JSON обратно в BSON
Няма значителни промени в Карта/Намаляване между 2.4 и 2.6.
Все още не препоръчвам използването на Map/Reduce за агрегиране в реално време в MongoDB версия 2.4 или 2.6.
4) Ако наистина имате нужда от Map/Reduce, можете да погледнете и Hadoop Adaptor. Тук има повече информация:
- 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