MapReduce е установен начин за паралелизиране на заявки за данни, но може ли тази алтернатива да предложи още повече предимства?

Ключови изводи

  • MapReduce и тръбопроводът за агрегиране са два метода за сложна обработка на данни в MongoDB. Рамката за агрегиране е по-нова и по-ефективна.
  • MapReduce включва указване на отделни функции за карта и намаляване с помощта на JavaScript, докато конвейерът за агрегиране използва вградени оператори MongoDB.
  • Конвейерът за агрегиране се препоръчва от MongoDB за по-добра производителност, но MapReduce предлага повече гъвкавост и е подходящ за разпределени файлови системи като Hadoop.

MapReduce и тръбопроводът за агрегиране са двата метода, които можете да използвате, за да се справите със сложната обработка на данни в MongoDB. Рамката за агрегиране е по-нова и известна със своята ефективност. Но някои разработчици все още предпочитат да се придържат към MapReduce, който смятат за по-удобен.

На практика искате да изберете един от тези сложни методи за заявка, тъй като те постигат същата цел. Но как работят? По какво се различават и кое трябва да използвате?

instagram viewer

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

MapReduce в MongoDB ви позволява да изпълнявате сложни изчисления върху голям обем данни и да обобщавате резултата в по-изчерпателна част. Методът MapReduce включва две функции: карта и намаляване.

Докато работите с MapReduce в MongoDB, вие ще посочите картата и функциите за намаляване отделно с помощта на JavaScript и ще вмъкнете всяка във вградения mapReduce заявка.

Функцията map първо разделя входящите данни на двойки ключ-стойност - обикновено въз основа на картографирано групиране. Тук посочвате как искате да групирате данните. След това функцията за намаляване изпълнява персонализирани изчисления на стойностите във всяка група данни и агрегира резултата в отделна колекция, съхранявана в базата данни.

Как работи тръбопроводът за агрегиране в MongoDB

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

Вместо това, той използва вградени MongoDB оператори за манипулиране, групиране и изчисляване на данни. След това агрегира резултатите след всяка заявка. По този начин тръбопроводът за агрегиране е по-адаптивен, тъй като можете да структурирате изхода, както желаете.

Как се различават заявките между MapReduce и Aggregation

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

Вземете някои примерни необработени данни за описаната декларация за проблем, които изглеждат така:

Нека разрешим този проблемен сценарий с помощта на MapReduce и тръбопровод за агрегиране, за да правим разлика между техните заявки и методи за решаване на проблеми.

Методът MapReduce

Използвайки Python като основен език за програмиране, the mapReduce заявката на описания по-горе проблемен сценарий изглежда така:

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
}]

Погледнете внимателно и трябва да видите, че процесорите за карта и намаляване са JavaScript функции вътре в променливите на Python. Кодът ги предава на mapReduce заявка, която указва специална изходна колекция (секции_общо).

Използване на тръбопровод за агрегиране

В допълнение към предоставянето на по-плавен изход, заявката за конвейер за агрегиране е по-директна. Ето как изглежда предишната операция с тръбопровода за агрегиране:

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 GB RAM, конвейерът за агрегиране изглежда по-бърз, средно 0,014 секунди по време на изпълнение. На същата машина са били необходими средно 0,058 секунди, за да изпълни заявката MapReduce.

Това не е критерий за заключение за тяхното представяне, но изглежда, че подкрепя препоръката на 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 има повече смисъл.