МапРедуце је успостављен начин паралелизације упита података, али може ли ова алтернатива понудити још више предности?

Кључне Такеаваис

  • МапРедуце и цевовод за агрегацију су две методе за сложену обраду података у МонгоДБ. Оквир агрегације је новији и ефикаснији.
  • МапРедуце укључује специфицирање одвојених функција мапирања и редукције користећи ЈаваСцрипт, док цевовод за агрегацију користи уграђене МонгоДБ операторе.
  • МонгоДБ препоручује цевовод за агрегацију за боље перформансе, али МапРедуце нуди већу флексибилност и погодан је за дистрибуиране системе датотека као што је Хадооп.

МапРедуце и цевовод за агрегацију су две методе које можете да користите за решавање сложене обраде података у МонгоДБ-у. Оквир агрегације је новији и познат по својој ефикасности. Али неки програмери и даље радије држе МапРедуце, ​​који сматрају удобнијим.

Практично, желите да изаберете једну од ових сложених метода упита пошто оне постижу исти циљ. Али како они раде? По чему се разликују и које бисте требали користити?

Како МапРедуце ради у МонгоДБ-у

МапРедуце у МонгоДБ вам омогућава да покренете сложене прорачуне на великој количини података и да обједините резултат у свеобухватнији комад. Метода МапРедуце има две функције: мапирање и смањење.

Док радите са МапРедуце-ом у МонгоДБ-у, одредићете мапу и функције редукције одвојено користећи ЈаваСцрипт и уметнути сваку у уграђени Карта смањити упит.

Функција мапе прво дели долазне податке у парове кључ-вредност—обично на основу мапираног груписања. Овде одређујете како желите да групишете податке. Функција редукције затим покреће прилагођена израчунавања за вредности у свакој групи података и агрегира резултат у посебну колекцију ускладиштену у бази података.

Како функционише агрегациони цевовод у МонгоДБ-у

Агрегациони цевовод у МонгоДБ је побољшана алтернатива МапРедуце-у. Као и МапРедуце, ​​омогућава вам да извршите сложене прорачуне и трансформације података директно унутар базе података. Али агрегација не захтева писање наменских ЈаваСцрипт функција које могу да смање перформансе упита.

Уместо тога, користи уграђене МонгоДБ операторе за манипулацију, груписање и израчунавање података. Затим агрегира резултате након сваког упита. Стога је цевовод за агрегацију прилагодљивији јер можете структурирати излаз како желите.

Како се упити разликују између МапРедуце и агрегације

Претпоставимо да желите да израчунате укупну продају артикала на основу категорија производа. У случају МапРедуце и агрегације, категорије производа постају кључеви, док суме ставки у свакој категорији постају одговарајуће вредности.

Узмите неке примере необрађених података за описану изјаву о проблему, која изгледа овако:

Хајде да решимо овај сценарио проблема користећи МапРедуце и агрегациони цевовод да бисмо разликовали њихове упите и методе решавања проблема.

Метода МапРедуце

Користећи Питхон као основни програмски језик, Карта смањити упит претходно описаног сценарија проблема изгледа овако:

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

Погледајте пажљиво и требало би да видите да су процесори мапе и редукције ЈаваСцрипт функције унутар Питхон променљивих. Код их прослеђује на Карта смањити упит, који специфицира наменску излазну колекцију (сецтион_тоталс).

Коришћење агрегационог цевовода

Поред тога што даје глаткији излаз, упит цевовода агрегације је директнији. Ево како изгледа претходна операција са цевоводом агрегације:

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)

Покретање овог упита за агрегацију ће дати следеће резултате, који су слични резултатима МапРедуце приступа:

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

Перформансе и брзина упита

Цјевовод за агрегацију је ажурирана верзија МапРедуце-а. МонгоДБ препоручује коришћење цевовода за агрегацију уместо МапРедуце-а, јер је први ефикаснији.

Покушали смо да потврдимо ову тврдњу док смо извршавали упите у претходном одељку. А када се изврши упоредо на машини од 12 ГБ РАМ-а, чинило се да је цевовод за агрегацију бржи, у просеку 0,014 секунди током извршавања. Истој машини је требало у просеку 0,058 секунди да покрене МапРедуце упит.

То није мерило за закључивање њихових перформанси, али изгледа да подржава препоруку МонгоДБ-а. Ову временску разлику можете сматрати безначајном, али ће се она значајно повећати у хиљадама или милионима упита.

Предности и недостаци МапРедуце-а

Узмите у обзир предности и недостатке МапРедуце-а да бисте утврдили где се истиче у обради података.

Прос

  • Даје већу флексибилност за прилагођавање пошто пишете мапу и смањујете функције одвојено.
  • Можете лако да сачувате излаз у нову МонгоДБ колекцију унутар базе података.
  • Можете користити МапРедуце у дистрибуираним системима датотека као што је Хадооп, који се лако интегрише са МонгоДБ.
  • Његова подршка за скриптовање трећих страна чини га скалабилнијим и лакшим за учење од цевовода за агрегацију. Дакле, неко са позадином развоја ЈаваСцрипт-а може да имплементира МапРедуце.

Цонс

  • Захтева скриптовање треће стране; ово доприноси нижим перформансама од агрегационог цевовода.
  • МапРедуце може бити меморијски неефикасан, захтевајући неколико чворова, посебно када се ради са превише сложеним подацима.
  • Није погодан за обраду података у реалном времену јер упити могу бити спори.

За и против агрегационог цевовода

Шта је са цевоводом за агрегацију? Узимање у обзир његових предности и мана даје бољи увид.

Прос

  • Упит је вишестепени, обично краћи, сажетији и читљивији.
  • Агрегациони цевовод је ефикаснији и нуди значајно побољшање у односу на МапРедуце.
  • Подржава уграђене МонгоДБ операторе који вам омогућавају да флексибилно дизајнирате свој упит.
  • Подржава обраду података у реалном времену.
  • Цевовод за агрегацију се лако уноси у МонгоДБ и не захтева скриптовање треће стране.
  • Можете креирајте нову МонгоДБ колекцију за излазе ако треба да их сачувате.

Цонс

  • Можда неће бити тако флексибилан као МапРедуце када се ради са сложенијим структурама података. Пошто не користи скриптовање треће стране, ограничава вас на одређени метод агрегирања података.
  • Његова имплементација и крива учења могу бити изазовни за програмере са мало или нимало искуства са МонгоДБ.

Када треба да користите МапРедуце или агрегациони цевовод?

Генерално, најбоље је узети у обзир своје захтеве за обраду података када бирате између МапРедуце-а и цевовода за агрегацију.

У идеалном случају, ако су ваши подаци сложенији и захтевају напредну логику и алгоритме у дистрибуираном систему датотека, МапРедуце може бити од користи. То је зато што можете лако да прилагодите функције за смањење мапе и убаците их у неколико чворова. Идите на МапРедуце ако ваш задатак обраде података захтева хоризонталну скалабилност у односу на ефикасност.

С друге стране, цевовод за агрегацију је погоднији за израчунавање сложених података који не захтевају прилагођену логику или алгоритме. Ако се ваши подаци налазе само у МонгоДБ-у, има смисла користити цевовод за агрегацију јер садржи много уграђених оператора.

Цевовод за агрегацију је такође најбољи за обраду података у реалном времену. Ако ваш захтев за рачунањем даје предност ефикасности у односу на друге факторе, желите да се одлучите за цевовод за агрегацију.

Покрените сложена израчунавања у МонгоДБ-у

Иако су обе методе МонгоДБ велики упити за обраду података, они деле много разлика. Уместо преузимања података пре извођења прорачуна, што може бити спорије, обе методе директно изводе прорачуне на подацима ускладиштеним у бази података, чинећи упите ефикаснијим.

Међутим, једно замењује друго у перформансама, и добро сте погодили. Цевовод за агрегацију надмашује МапРедуце у ефикасности и перформансама. Али иако бисте можда желели да замените МапРедуце цевоводом за агрегацију по сваку цену, још увек постоје специфичне области примене у којима коришћење МапРедуце има више смисла.