MapReduce je ustaljeni način paraleliziranja podatkovnih upita, no može li ova alternativa ponuditi još više prednosti?

Ključni zahvati

  • MapReduce i cjevovod agregacije dvije su metode za složenu obradu podataka u MongoDB-u. Okvir agregacije je noviji i učinkovitiji.
  • MapReduce uključuje određivanje zasebnih funkcija mapiranja i reduciranja pomoću JavaScripta, dok cjevovod agregacije koristi ugrađene MongoDB operatore.
  • MongoDB preporučuje agregacijski cjevovod za bolje performanse, ali MapReduce nudi veću fleksibilnost i prikladan je za distribuirane datotečne sustave poput Hadoopa.

MapReduce i agregacijski cjevovod dvije su metode koje možete koristiti za rješavanje složene obrade podataka u MongoDB-u. Okvir agregacije je noviji i poznat po svojoj učinkovitosti. Ali neki programeri i dalje se radije drže MapReducea, koji smatraju udobnijim.

Praktično, želite odabrati jednu od ovih složenih metoda upita jer postižu isti cilj. Ali kako oni rade? Po čemu se razlikuju i koje biste trebali koristiti?

instagram viewer

Kako MapReduce radi u MongoDB-u

MapReduce u MongoDB-u omogućuje vam izvođenje složenih izračuna na velikoj količini podataka i agregiranje rezultata u sveobuhvatniji dio. Metoda MapReduce ima dvije funkcije: mapiranje i smanjivanje.

Dok radite s MapReduce u MongoDB-u, odredit ćete mapu i funkcije redukcije odvojeno koristeći JavaScript i umetnuti svaku u ugrađeni mapReduce upit.

Funkcija karte prvo dijeli dolazne podatke u parove ključ-vrijednost—obično na temelju mapiranog grupiranja. Ovdje određujete kako želite grupirati podatke. Funkcija redukcije zatim izvodi prilagođene izračune na vrijednostima u svakoj grupi podataka i agregira rezultat u zasebnu zbirku pohranjenu u bazi podataka.

Kako radi agregacijski cjevovod u MongoDB-u

Cjevovod agregacije u MongoDB-u poboljšana je alternativa MapReduceu. Kao i MapReduce, omogućuje vam izvođenje složenih izračuna i transformacija podataka izravno unutar baze podataka. No agregacija ne zahtijeva pisanje namjenskih JavaScript funkcija koje mogu smanjiti izvedbu upita.

Umjesto toga, koristi ugrađene MongoDB operatore za manipulaciju, grupiranje i izračunavanje podataka. Zatim agregira rezultate nakon svakog upita. Stoga je cjevovod agregacije prilagodljiviji budući da možete strukturirati izlaz kako želite.

Kako se upiti razlikuju između MapReduce i Aggregation

Pretpostavimo da želite izračunati ukupnu prodaju artikala na temelju kategorija proizvoda. U slučaju MapReduce i agregacije, kategorije proizvoda postaju ključevi, dok zbrojevi stavki u svakoj kategoriji postaju odgovarajuće vrijednosti.

Uzmite neke primjere neobrađenih podataka za opisanu izjavu o problemu koji izgleda ovako:

Riješimo ovaj problemski scenarij pomoću MapReducea i cjevovoda agregacije kako bismo razlikovali njihove upite i metode rješavanja problema.

Metoda MapReduce

Koristeći Python kao osnovni programski jezik, mapReduce upit prethodno opisanog scenarija problema izgleda ovako:

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)

Ako ovo pokrenete s izvornim oglednim podacima, vidjet ćete izlaz poput ovog:

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

Pogledajte izbliza i trebali biste vidjeti da su procesori karte i redukcije JavaScript funkcije unutar Python varijabli. Kod ih prosljeđuje na mapReduce upit, koji navodi namjensku kolekciju izlaza (odjeljak_ukupno).

Korištenje cjevovoda agregacije

Osim što daje glatkiji izlaz, upit cjevovoda agregacije je izravniji. Evo kako prethodna operacija izgleda s cjevovodom agregacije:

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)

Pokretanje ovog agregacijskog upita dat će sljedeće rezultate, koji su slični rezultatima MapReduce pristupa:

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

Izvedba i brzina upita

Cjevovod agregacije ažurirana je verzija MapReducea. MongoDB preporučuje korištenje cjevovoda agregacije umjesto MapReducea, jer je prvi učinkovitiji.

Pokušali smo potvrditi ovu tvrdnju tijekom pokretanja upita u prethodnom odjeljku. A kada se izvršava paralelno na stroju od 12 GB RAM-a, čini se da je agregacijski cjevovod brži, u prosjeku 0,014 sekundi tijekom izvođenja. Istom je stroju u prosjeku trebalo 0,058 sekundi da pokrene MapReduce upit.

To nije mjerilo za zaključivanje njihovih performansi, ali čini se da podupire preporuku MongoDB-a. Ovu vremensku razliku možete smatrati beznačajnom, ali ona će se znatno povećati na tisuće ili milijune upita.

Prednosti i mane MapReducea

Razmotrite prednosti i nedostatke MapReducea kako biste utvrdili gdje se ističe u obradi podataka.

Pros

  • Daje veću fleksibilnost za prilagodbu budući da mapu i smanjite funkcije pišete zasebno.
  • Izlaz možete jednostavno spremiti u novu MongoDB kolekciju unutar baze podataka.
  • Možeš koristiti MapReduce u distribuiranim datotečnim sustavima poput Hadoopa, koji se lako integrira s MongoDB-om.
  • Njegova podrška za skriptiranje treće strane čini ga skalabilnijim i lakšim za učenje od cjevovoda agregacije. Dakle, netko s iskustvom u razvoju JavaScripta može implementirati MapReduce.

Protiv

  • Zahtijeva skriptiranje treće strane; to pridonosi njegovoj nižoj izvedbi od cjevovoda agregacije.
  • MapReduce može biti memorijski neučinkovit, zahtijevajući nekoliko čvorova, posebno kada se radi s previše složenim podacima.
  • Nije prikladan za obradu podataka u stvarnom vremenu jer postavljanje upita može biti sporo.

Za i protiv cjevovoda agregacije

Što je s cjevovodom agregacije? Razmatranje njegovih snaga i slabosti pruža bolji uvid.

Pros

  • Upit je višefazni, obično kraći, sažetiji i čitljiviji.
  • Cjevovod agregacije je učinkovitiji i nudi značajno poboljšanje u odnosu na MapReduce.
  • Podržava ugrađene MongoDB operatore koji vam omogućuju fleksibilno oblikovanje upita.
  • Podržava obradu podataka u stvarnom vremenu.
  • Cjevovod agregacije lako se može unijeti u MongoDB i ne zahtijeva skriptiranje treće strane.
  • Možeš stvoriti novu MongoDB kolekciju za izlaze ako ih trebate spremiti.

Protiv

  • Možda neće biti tako fleksibilan kao MapReduce kada se radi sa složenijim strukturama podataka. Budući da ne koristi skriptiranje treće strane, ograničava vas na određenu metodu prikupljanja podataka.
  • Njegova implementacija i krivulja učenja mogu biti izazovni za programere s malo ili nimalo iskustva s MongoDB-om.

Kada biste trebali koristiti MapReduce ili Aggregation Pipeline?

Općenito, najbolje je uzeti u obzir svoje zahtjeve za obradu podataka kada birate između MapReducea i cjevovoda agregacije.

U idealnom slučaju, ako su vaši podaci složeniji, zahtijevaju naprednu logiku i algoritme u distribuiranom datotečnom sustavu, MapReduce može dobro doći. To je zato što možete jednostavno prilagoditi funkcije smanjenja karte i ubaciti ih u nekoliko čvorova. Odaberite MapReduce ako vaš zadatak obrade podataka zahtijeva horizontalnu skalabilnost u odnosu na učinkovitost.

S druge strane, agregacijski cjevovod je prikladniji za izračunavanje složenih podataka koji ne zahtijevaju prilagođenu logiku ili algoritme. Ako se vaši podaci nalaze samo u MongoDB-u, ima smisla koristiti agregacijski cjevovod budući da ima mnogo ugrađenih operatora.

Cjevovod agregacije također je najbolji za obradu podataka u stvarnom vremenu. Ako vaš zahtjev za računanjem daje prednost učinkovitosti u odnosu na druge čimbenike, želite se odlučiti za cjevovod agregacije.

Izvršite složena izračunavanja u MongoDB-u

Iako su obje MongoDB metode upiti za obradu velikih podataka, dijele puno razlika. Umjesto dohvaćanja podataka prije izvođenja izračuna, što može biti sporije, obje metode izravno izvode izračune na podacima pohranjenim u bazi podataka, čineći upite učinkovitijima.

Međutim, jedno nadmašuje drugo u izvedbi, i dobro ste pogodili. Cjevovod agregacije nadmašuje MapReduce u učinkovitosti i izvedbi. No iako biste pod svaku cijenu mogli zamijeniti MapReduce cjevovodom agregacije, još uvijek postoje određena područja primjene u kojima korištenje MapReducea ima više smisla.