MapReduce — это устоявшийся способ распараллеливания запросов к данным, но может ли эта альтернатива предложить еще больше преимуществ?

Ключевые выводы

  • MapReduce и конвейер агрегации — это два метода сложной обработки данных в MongoDB. Платформа агрегации новее и эффективнее.
  • MapReduce включает в себя указание отдельных функций отображения и сокращения с использованием JavaScript, в то время как конвейер агрегации использует встроенные операторы MongoDB.
  • Конвейер агрегации рекомендуется MongoDB для повышения производительности, но MapReduce обеспечивает большую гибкость и подходит для распределенных файловых систем, таких как Hadoop.

MapReduce и конвейер агрегации — это два метода, которые вы можете использовать для обработки сложных данных в MongoDB. Фреймворк агрегации новее и известен своей эффективностью. Но некоторые разработчики по-прежнему предпочитают использовать MapReduce, который они считают более удобным.

Практически вы хотите выбрать один из этих сложных методов запроса, поскольку они достигают одной и той же цели. Но как они работают? Чем они отличаются и что следует использовать?

instagram viewer

Как MapReduce работает в MongoDB

MapReduce в MongoDB позволяет выполнять сложные вычисления с большим объемом данных и объединять результат в более полный фрагмент. В методе MapReduce есть две функции: map и reduce.

При работе с MapReduce в MongoDB вы будете отдельно указывать карту и функции редукции с помощью JavaScript и вставлять каждую из них во встроенный уменьшение карты запрос.

Функция карты сначала разбивает входящие данные на пары ключ-значение — обычно на основе сопоставленной группировки. Здесь вы указываете, как вы хотите сгруппировать данные. Затем функция сокращения выполняет пользовательские вычисления для значений в каждой группе данных и объединяет результат в отдельную коллекцию, хранящуюся в базе данных.

Как работает конвейер агрегации в MongoDB

Конвейер агрегации в MongoDB — это улучшенная альтернатива MapReduce. Как и MapReduce, он позволяет выполнять сложные вычисления и преобразования данных непосредственно внутри базы данных. Но агрегация не требует написания специальных функций JavaScript, которые могут снизить производительность запросов.

Вместо этого он использует встроенные операторы MongoDB для управления, группировки и вычисления данных. Затем он агрегирует результаты после каждого запроса. Таким образом, конвейер агрегации более настраиваемый, поскольку вы можете структурировать выходные данные по своему усмотрению.

Чем отличаются запросы между MapReduce и Aggregation

Предположим, вы хотите рассчитать общий объем продаж товаров на основе категорий продуктов. В случае MapReduce и агрегации категории продуктов становятся ключами, а суммы элементов в каждой категории становятся соответствующими значениями.

Возьмем пример необработанных данных для описанной постановки задачи, который выглядит так:

Давайте решим этот проблемный сценарий, используя MapReduce и конвейер агрегации, чтобы различать их запросы и методы решения проблем.

Метод MapReduce

Используя Python в качестве основного языка программирования, уменьшение карты запрос ранее описанного сценария проблемы выглядит так:

import pymongo

client = pymongo.MongoClient(
"mongodb://localhost/"
)

db = client.my_database

sales = db["sales"]

map_function =
function() {
emit(this.Section, this.Sold);
}

reduce_function =
function(key, values) {
return Array.sum(values);
}

result = db.command(
"mapReduce",
"sales",
map=map_function,
reduce=reduce_function,
out="section_totals"
)

doc = [doc for doc in db.section_totals.find()]
print(doc)

Если вы запустите это с исходными демонстрационными данными, вы увидите такой вывод:

[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]

Присмотритесь, и вы должны увидеть, что процессоры map и reduce Функции JavaScript внутри переменных Python. Код передает их в уменьшение карты запрос, который указывает выделенную коллекцию выходных данных (section_totals).

Использование конвейера агрегации

Помимо более плавного вывода, запрос конвейера агрегации является более прямым. Вот как выглядит предыдущая операция с конвейером агрегации:

import pymongo
client = pymongo.MongoClient("mongodb://localhost/")
db = client.funmi
sales = db["sales"]

pipeline = [
{
"$group": {
"_id": "$Section",
"totalSold": { "$sum": "$Sold" }
}
},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$totalSold"
}
}
]

result = list(sales.aggregate(pipeline))
print(result)

Выполнение этого запроса агрегации даст следующие результаты, аналогичные результатам подхода MapReduce:

[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]

Производительность и скорость запросов

Конвейер агрегации — это обновленная версия MapReduce. MongoDB рекомендует использовать конвейер агрегации вместо MapReduce, так как первый более эффективен.

Мы попытались подтвердить это утверждение при выполнении запросов в предыдущем разделе. А при параллельном выполнении на машине с 12 ГБ ОЗУ конвейер агрегации оказался быстрее, в среднем 0,014 секунды во время выполнения. На том же компьютере выполнение запроса MapReduce занимало в среднем 0,058 секунды.

Это не показатель их производительности, но, похоже, он подтверждает рекомендацию MongoDB. Вы можете считать эту разницу во времени незначительной, но она значительно увеличится при обработке тысяч или миллионов запросов.

Плюсы и минусы MapReduce

Подумайте о достоинствах и недостатках MapReduce, чтобы определить, в чем его преимущество в обработке данных.

Плюсы

  • Это дает больше гибкости для настройки, поскольку вы пишете карту и уменьшаете функции отдельно.
  • Вы можете легко сохранить вывод в новую коллекцию MongoDB внутри базы данных.
  • Вы можете использовать MapReduce в распределенных файловых системах например Hadoop, который легко интегрируется с MongoDB.
  • Его поддержка сторонних сценариев делает его более масштабируемым и простым в освоении, чем конвейер агрегации. Таким образом, кто-то с опытом разработки JavaScript может реализовать MapReduce.

Минусы

  • Это требует стороннего сценария; это способствует его более низкой производительности, чем конвейер агрегации.
  • MapReduce может быть неэффективным с точки зрения использования памяти, требуя нескольких узлов, особенно при работе с чрезмерно сложными данными.
  • Он не подходит для обработки данных в реальном времени, так как запросы могут быть медленными.

Плюсы и минусы конвейера агрегации

Как насчет конвейера агрегации? Рассмотрение его сильных и слабых сторон дает больше понимания.

Плюсы

  • Запрос многоэтапный, обычно короче, лаконичнее и читабельнее.
  • Конвейер агрегации более эффективен, предлагая значительное улучшение по сравнению с MapReduce.
  • Он поддерживает встроенные операторы MongoDB, которые позволяют гибко разрабатывать запросы.
  • Он поддерживает обработку данных в реальном времени.
  • Конвейер агрегации легко внедряется в MongoDB и не требует сторонних сценариев.
  • Ты можешь создать новую коллекцию MongoDB для выходов, если вам нужно их сохранить.

Минусы

  • Он может быть не таким гибким, как MapReduce, при работе с более сложными структурами данных. Поскольку он не использует сторонние сценарии, он ограничивает вас определенным методом агрегирования данных.
  • Его реализация и кривая обучения могут быть сложными для разработчиков с небольшим опытом работы с MongoDB или без него.

Когда следует использовать MapReduce или Aggregation Pipeline?

Как правило, при выборе между MapReduce и конвейером агрегации лучше учитывать свои требования к обработке данных.

В идеале, если ваши данные более сложные, требующие расширенной логики и алгоритмов в распределенной файловой системе, вам может пригодиться MapReduce. Это потому, что вы можете легко настроить функции уменьшения карты и внедрить их в несколько узлов. Используйте MapReduce, если ваша задача обработки данных требует горизонтальной масштабируемости, а не эффективности.

С другой стороны, конвейер агрегации больше подходит для обработки сложных данных, не требующих специальной логики или алгоритмов. Если ваши данные находятся только в MongoDB, имеет смысл использовать конвейер агрегации, поскольку он имеет множество встроенных операторов.

Конвейер агрегации также лучше всего подходит для обработки данных в реальном времени. Если ваши требования к вычислениям отдают приоритет эффективности над другими факторами, вы можете выбрать конвейер агрегации.

Выполнение сложных вычислений в MongoDB

Хотя оба метода MongoDB являются запросами на обработку больших данных, они имеют много различий. Вместо извлечения данных перед выполнением вычислений, что может быть медленнее, оба метода напрямую выполняют вычисления с данными, хранящимися в базе данных, что делает запросы более эффективными.

Однако по производительности одно превосходит другое, и вы угадали. Конвейер агрегации превосходит MapReduce по эффективности и производительности. Но хотя вы можете захотеть заменить MapReduce конвейером агрегации любой ценой, все же есть определенные области применения, где использование MapReduce имеет больше смысла.