Я нашел это обсуждение: MongoDB: Ужасная производительность MapReduce. В основном это говорит о том, чтобы попытаться избежать запросов Mongo MR, поскольку он однопоточный и не должен быть в реальном времени вообще. Прошло 2 года, и мне интересно, что изменилось с тех пор. Теперь у нас есть MongoDb 2.2. Я слышал, что МРС теперь многопоточные. Поделитесь своими идеями по использованию MR для запросов в реальном времени, например, для получения данных для частых HTTP-запросов веб-приложений. Способна ли она эффективно использовать индексы?
Карта - снижение производительности в MongoDb 2.2, 2.4 и 2.6
Ответ 1
Вот текущее состояние функциональности для Map/Reduce в MongoDB
1) Большинство ограничений производительности для Map/Reduce по-прежнему остаются в версии 2.2 MongoDB. Двигатель Map/Reduce по-прежнему требует, чтобы каждая запись была преобразована из BSON в JSON, фактические вычисления выполняются с использованием встроенного механизма JavaScript (который медленный), и все еще существует одна глобальная блокировка JavaScript, которая допускает только один поток JavaScript для запуска за один раз.
Были внесены некоторые дополнительные улучшения в Map/Reduce для оштукатуренных кластеров. Наиболее заметно, что окончательная операция сокращения теперь распределяется по нескольким осколкам, а выход также распределяется параллельно.
Я бы не рекомендовал Map/Reduce для агрегирования в реальном времени в версии MongoDB версии 2.2
2) Начиная с MongoDB 2.2, теперь появилась новая структура агрегации. Это новая реализация операций агрегации, написанная на С++, и тесно интегрированная в рамки MongoDB.
Большинство объявлений Map/Reduce можно переписать для использования структуры агрегации. Они обычно работают быстрее (20-кратное повышение скорости по сравнению с Map/Reduce распространено в версии 2.2), они в полной мере используют существующий механизм запросов, и вы можете запускать несколько команд агрегации параллельно.
Если у вас есть требования к агрегации в реальном времени, первое, что нужно начать, - это Агрегационная структура. Дополнительные сведения о структуре агрегации см. В следующих ссылках:
- http://www.10gen.com/presentations/mongonyc-2012/new-aggregation-framework
- http://docs.mongodb.org/manual/reference/aggregation/
3) В версии MongoDB версии 2.4 произошли значительные улучшения в Map/Reduce. Механизм JavaScript SpiderMonkey был заменен механизмом JavaScript V8, и теперь уже нет глобальной блокировки JavaScript, что означает, что несколько потоков Map/Reduce могут выполняться одновременно.
Двигатель Map/Reduce по-прежнему значительно медленнее, чем структура агрегации, по двум основным причинам:
-
Механизм JavaScript интерпретируется, а структура агрегации запускает скомпилированный код на С++
-
Механизм JavaScript по-прежнему требует, чтобы каждый проверенный документ преобразовывался из BSON в JSON; если вы сохраняете вывод в коллекции, результирующий набор затем должен быть преобразован из JSON обратно в BSON
Нет существенных изменений в Map/Reduce между 2.4 и 2.6.
Я по-прежнему не рекомендую использовать Map/Reduce для агрегации в реальном времени в MongoDB версии 2.4 или 2.6.
4) Если вам действительно нужна карта/сокращение, вы также можете посмотреть адаптер Hadoop. Там больше информации: