Подтвердить что ты не робот

Карта - снижение производительности в MongoDb 2.2, 2.4 и 2.6

Я нашел это обсуждение: MongoDB: Ужасная производительность MapReduce. В основном это говорит о том, чтобы попытаться избежать запросов Mongo MR, поскольку он однопоточный и не должен быть в реальном времени вообще. Прошло 2 года, и мне интересно, что изменилось с тех пор. Теперь у нас есть MongoDb 2.2. Я слышал, что МРС теперь многопоточные. Поделитесь своими идеями по использованию MR для запросов в реальном времени, например, для получения данных для частых HTTP-запросов веб-приложений. Способна ли она эффективно использовать индексы?

4b9b3361

Ответ 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), они в полной мере используют существующий механизм запросов, и вы можете запускать несколько команд агрегации параллельно.

Если у вас есть требования к агрегации в реальном времени, первое, что нужно начать, - это Агрегационная структура. Дополнительные сведения о структуре агрегации см. В следующих ссылках:

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. Там больше информации: