MapReduce este o modalitate consacrată de paralelizare a interogărilor de date, dar poate această alternativă să ofere și mai multe beneficii?

Recomandări cheie

  • MapReduce și conducta de agregare sunt două metode pentru procesarea complexă a datelor în MongoDB. Cadrul de agregare este mai nou și mai eficient.
  • MapReduce implică specificarea funcțiilor de hărți și reducere separate folosind JavaScript, în timp ce conducta de agregare utilizează operatorii MongoDB încorporați.
  • Conducta de agregare este recomandată de MongoDB pentru o performanță mai bună, dar MapReduce oferă mai multă flexibilitate și este potrivit pentru sistemele de fișiere distribuite precum Hadoop.

MapReduce și conducta de agregare sunt cele două metode pe care le puteți utiliza pentru a face față procesării complexe a datelor în MongoDB. Cadrul de agregare este mai nou și cunoscut pentru eficiența sa. Dar unii dezvoltatori încă preferă să rămână la MapReduce, pe care îl consideră mai confortabil.

Practic, doriți să alegeți una dintre aceste metode complexe de interogare, deoarece ating același obiectiv. Dar cum funcționează? Cum sunt diferite și pe care ar trebui să le folosiți?

instagram viewer

Cum funcționează MapReduce în MongoDB

MapReduce din MongoDB vă permite să executați calcule complexe pe un volum mare de date și să agregați rezultatul într-o bucată mai cuprinzătoare. Metoda MapReduce are două funcții: map și reduce.

În timp ce lucrați cu MapReduce în MongoDB, veți specifica harta și funcțiile de reducere separat folosind JavaScript și veți introduce fiecare în sistemul încorporat. mapReduce interogare.

Funcția de hartă împarte mai întâi datele primite în perechi cheie-valoare, de obicei pe baza grupării mapate. Aici specificați cum doriți să grupați datele. Funcția de reducere rulează apoi calcule personalizate asupra valorilor din fiecare grup de date și agregează rezultatul într-o colecție separată stocată în baza de date.

Cum funcționează conducta de agregare în MongoDB

Conducta de agregare din MongoDB este o alternativă îmbunătățită la MapReduce. La fel ca MapReduce, vă permite să efectuați calcule complexe și transformări de date direct în baza de date. Dar agregarea nu necesită scrierea de funcții JavaScript dedicate care pot reduce performanța interogărilor.

În schimb, folosește operatorii MongoDB încorporați pentru a manipula, grupa și calcula datele. Apoi, adună rezultatele după fiecare interogare. Astfel, conducta de agregare este mai personalizabilă, deoarece puteți structura rezultatul după cum doriți.

Cum diferă interogările între MapReduce și Aggregation

Să presupunem că doriți să calculați vânzările totale de articole pe baza categoriilor de produse. În cazul MapReduce și agregare, categoriile de produse devin cheile, în timp ce sumele articolelor din fiecare categorie devin valorile corespunzătoare.

Luați câteva exemple de date brute pentru declarația de problemă descrisă, care arată astfel:

Să rezolvăm acest scenariu de problemă folosind MapReduce și o conductă de agregare pentru a diferenția între interogările și metodele de rezolvare a problemelor.

Metoda MapReduce

Folosind Python ca limbaj de programare de bază, mapReduce interogarea scenariului de problemă descris anterior arată astfel:

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)

Dacă executați acest lucru pe baza datelor eșantionului inițial, veți vedea rezultate ca aceasta:

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

Uitați-vă cu atenție și ar trebui să vedeți că harta și procesoarele reduc sunt Funcții JavaScript în interiorul variabilelor Python. Codul le transmite către mapReduce interogare, care specifică o colecție de ieșire dedicată (secțiuni_totaluri).

Utilizarea unei conducte de agregare

Pe lângă faptul că oferă o ieșire mai fluidă, interogarea conductei de agregare este mai directă. Iată cum arată operația anterioară cu conducta de agregare:

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)

Rularea acestei interogări de agregare va da următoarele rezultate, care sunt similare cu rezultatele abordării MapReduce:

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

Performanța și viteza interogărilor

Conducta de agregare este o versiune actualizată a MapReduce. MongoDB recomandă utilizarea conductei de agregare în loc de MapReduce, deoarece prima este mai eficientă.

Am încercat să afirmăm această afirmație în timp ce rulăm interogările din secțiunea anterioară. Și când a fost executat unul lângă altul pe o mașină de 12 GB RAM, conducta de agregare părea a fi mai rapidă, cu o medie de 0,014 secunde în timpul execuției. Aceeași mașină i-a luat o medie de 0,058 secunde pentru a rula interogarea MapReduce.

Acesta nu este un criteriu pentru a concluziona cu privire la performanțele lor, dar pare să susțină recomandarea MongoDB. S-ar putea să considerați această diferență de timp nesemnificativă, dar se va aduna considerabil la mii sau milioane de interogări.

Avantajele și dezavantajele MapReduce

Luați în considerare avantajele și dezavantajele MapReduce pentru a determina unde excelează în procesarea datelor.

Pro

  • Oferă mai multă flexibilitate pentru personalizare, deoarece scrieți harta și reduceți funcțiile separat.
  • Puteți salva cu ușurință rezultatul într-o nouă colecție MongoDB în baza de date.
  • Poți să folosești MapReduce în sistemele de fișiere distribuite precum Hadoop, care se integrează ușor cu MongoDB.
  • Suportul său pentru scripturi de la terți îl face mai scalabil și mai ușor de învățat decât conducta de agregare. Deci cineva cu un fundal de dezvoltare JavaScript poate implementa MapReduce.

Contra

  • Necesită scripturi de la terți; aceasta contribuie la performanța sa mai scăzută decât conducta de agregare.
  • MapReduce poate fi ineficient de memorie, necesitând mai multe noduri, mai ales atunci când se ocupă cu date prea complexe.
  • Nu este potrivit pentru procesarea datelor în timp real, deoarece interogarea poate fi lentă.

Avantaje și dezavantaje ale conductei de agregare

Ce zici de conducta de agregare? Luarea în considerare a punctelor forte și a punctelor slabe oferă mai multe informații.

Pro

  • Interogarea este în mai multe etape, de obicei mai scurtă, mai concisă și mai ușor de citit.
  • Conducta de agregare este mai eficientă, oferind o îmbunătățire semnificativă față de MapReduce.
  • Acceptă operatorii MongoDB încorporați care vă permit să vă proiectați interogarea în mod flexibil.
  • Acceptă procesarea datelor în timp real.
  • Conducta de agregare este ușor de ingerat în MongoDB și nu necesită scripturi terțe.
  • Puteți creați o nouă colecție MongoDB pentru ieșiri dacă trebuie să le salvați.

Contra

  • Este posibil să nu fie la fel de flexibil ca MapReduce atunci când aveți de-a face cu structuri de date mai complexe. Deoarece nu utilizează scripturi terțe, vă limitează la o anumită metodă de agregare a datelor.
  • Implementarea și curba sa de învățare pot fi o provocare pentru dezvoltatorii cu puțină sau deloc experiență cu MongoDB.

Când ar trebui să utilizați MapReduce sau Aggregation Pipeline?

În general, cel mai bine este să țineți cont de cerințele dvs. de procesare a datelor atunci când alegeți între MapReduce și conducta de agregare.

În mod ideal, dacă datele dvs. sunt mai complexe, necesită o logică avansată și algoritmi într-un sistem de fișiere distribuit, MapReduce poate fi util. Acest lucru se datorează faptului că puteți personaliza cu ușurință funcțiile de reducere a hărții și le puteți injecta în mai multe noduri. Alegeți MapReduce dacă sarcina dvs. de procesare a datelor necesită scalabilitate orizontală în detrimentul eficienței.

Pe de altă parte, conducta de agregare este mai potrivită pentru calcularea datelor complexe care nu necesită logică sau algoritmi personalizați. Dacă datele dvs. se află numai în MongoDB, este logic să utilizați conducta de agregare, deoarece include mulți operatori încorporați.

Conducta de agregare este, de asemenea, cea mai bună pentru procesarea datelor în timp real. Dacă cerințele dvs. de calcul prioritizează eficiența față de alți factori, doriți să optați pentru conducta de agregare.

Rulați calcule complexe în MongoDB

Deși ambele metode MongoDB sunt interogări de procesare a datelor mari, ele au multe diferențe. În loc să recupereze date înainte de a efectua calcule, care pot fi mai lente, ambele metode efectuează direct calcule pe datele stocate în baza de date, făcând interogările mai eficiente.

Cu toate acestea, unul îl înlocuiește pe celălalt în performanță și ați ghicit bine. Conducta de agregare depășește MapReduce în eficiență și performanță. Dar, deși s-ar putea să doriți să înlocuiți MapReduce cu conducta de agregare cu orice preț, există încă domenii specifice de aplicație în care utilizarea MapReduce are mai mult sens.