Ecco lo stato attuale delle funzionalità di Map/Reduce in MongoDB
1) La maggior parte delle limitazioni delle prestazioni per Map/Reduce rimangono ancora in MongoDB versione 2.2. Il motore Map/Reduce richiede comunque che ogni record venga convertito da BSON a JSON, i calcoli effettivi vengono eseguiti utilizzando il motore JavaScript incorporato (che è lento) e c'è ancora un unico blocco JavaScript globale, che consente solo un singolo thread JavaScript per eseguire in una sola volta.
Sono stati apportati alcuni miglioramenti incrementali a Mappa/Riduci per i cluster partizionati. In particolare, l'operazione di riduzione finale è ora distribuita su più shard e anche l'output viene suddiviso in parallelo.
Non consiglierei Map/Reduce per l'aggregazione in tempo reale in MongoDB versione 2.2
2) A partire da MongoDB 2.2, ora c'è un nuovo Aggregation Framework. Questa è una nuova implementazione delle operazioni di aggregazione, scritta in C++ e strettamente integrata nel framework MongoDB.
La maggior parte dei lavori Mappa/Riduci possono essere riscritti per utilizzare il Framework di aggregazione. Di solito funzionano più velocemente (il miglioramento della velocità di 20 volte rispetto a Map/Reduce è comune nella versione 2.2), sfruttano appieno il motore di query esistente e puoi eseguire più comandi di aggregazione in parallelo.
Se hai requisiti di aggregazione in tempo reale, il primo punto di partenza è il Framework di aggregazione. Per ulteriori informazioni sul framework di aggregazione, dai un'occhiata a questi link:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) Ci sono stati miglioramenti significativi in Map/Reduce in MongoDB versione 2.4. Il motore JavaScript SpiderMonkey è stato sostituito dal motore JavaScript V8 e non esiste più un blocco JavaScript globale, il che significa che più thread Map/Reduce possono essere eseguiti contemporaneamente.
Il motore Map/Reduce è ancora notevolmente più lento del framework di aggregazione, per due ragioni principali:
-
Il motore JavaScript viene interpretato, mentre Aggregation Framework esegue codice C++ compilato
-
Il motore JavaScript richiede comunque che ogni documento in esame venga convertito da BSON a JSON; se stai salvando l'output in una raccolta, il set di risultati deve essere riconvertito da JSON a BSON
Non ci sono modifiche significative in Mappa/Riduci tra 2.4 e 2.6.
Continuo a non consigliare di utilizzare Map/Reduce per l'aggregazione in tempo reale in MongoDB versione 2.4 o 2.6.
4) Se hai davvero bisogno di Map/Reduce, puoi anche guardare l'adattatore Hadoop. Ci sono ulteriori informazioni qui:
- 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