Oto aktualny stan funkcji Map/Reduce w MongoDB
1) Większość ograniczeń wydajności Map/Reduce nadal występuje w MongoDB w wersji 2.2. Silnik Map/Reduce nadal wymaga, aby każdy rekord został przekonwertowany z BSON na JSON, rzeczywiste obliczenia są wykonywane przy użyciu wbudowanego silnika JavaScript (który jest powolny) i nadal istnieje jedna globalna blokada JavaScript, która pozwala tylko na jeden wątek JavaScript do uruchomienia w jednym czasie.
Wprowadzono kilka przyrostowych ulepszeń Map/Reduce dla klastrów podzielonych na fragmenty. Przede wszystkim ostateczna operacja Reduce jest teraz rozłożona na wiele fragmentów, a dane wyjściowe są również fragmentowane równolegle.
Nie polecałbym Map/Reduce do agregacji w czasie rzeczywistym w MongoDB w wersji 2.2
2) Począwszy od MongoDB 2.2, istnieje teraz nowy framework agregacji. Jest to nowa implementacja operacji agregacji, napisana w C++ i ściśle zintegrowana ze strukturą MongoDB.
Większość zadań Map/Reduce można przepisać, aby korzystać z agregacji Framework. Zwykle działają szybciej (20-krotna poprawa szybkości w porównaniu z mapowaniem/zmniejszaniem jest powszechna w wersji 2.2), w pełni wykorzystują istniejący silnik zapytań i można równolegle uruchamiać wiele poleceń agregacji.
Jeśli masz wymagania dotyczące agregacji w czasie rzeczywistym, najpierw należy zacząć od agregacji Framework. Aby uzyskać więcej informacji na temat struktury agregacji, spójrz na te linki:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) W MongoDB w wersji 2.4 wprowadzono znaczące ulepszenia funkcji Map/Reduce. Silnik JavaScript SpiderMonkey został zastąpiony przez silnik JavaScript V8 i nie ma już globalnej blokady JavaScript, co oznacza, że wiele wątków Map/Reduce może działać jednocześnie.
Silnik Map/Reduce jest nadal znacznie wolniejszy niż framework agregacji z dwóch głównych powodów:
-
Silnik JavaScript jest interpretowany, podczas gdy Aggregation Frameworkruns skompilował kod C++
-
Silnik JavaScript nadal wymaga, aby każdy badany dokument został przekonwertowany z BSON na JSON; jeśli zapisujesz dane wyjściowe w kolekcji, zestaw wyników musi zostać przekonwertowany z JSON z powrotem na BSON
Nie ma znaczących zmian w Map/Reduce między 2.4 a 2.6.
Nadal nie polecam używania Map/Reduce do agregacji w czasie rzeczywistym w MongoDB w wersji 2.4 lub 2.6.
4) Jeśli naprawdę potrzebujesz Map/Reduce, możesz również spojrzeć na adapter Hadoop. Więcej informacji znajdziesz tutaj:
- 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+Szybki+Start