„MapReduce“ yra nusistovėjęs duomenų užklausų lygiagretinimo būdas, tačiau ar ši alternatyva gali pasiūlyti dar daugiau naudos?
Key Takeaways
- „MapReduce“ ir agregavimo vamzdynas yra du sudėtingo duomenų apdorojimo „MongoDB“ metodai. Agregavimo sistema yra naujesnė ir efektyvesnė.
- „MapReduce“ apima atskirų žemėlapių ir mažinimo funkcijų nurodymą naudojant „JavaScript“, o agregavimo vamzdynas naudoja įtaisytuosius MongoDB operatorius.
- „MongoDB“ rekomenduoja kaupimo dujotiekį, kad būtų geresnis našumas, tačiau „MapReduce“ siūlo daugiau lankstumo ir tinka paskirstytoms failų sistemoms, tokioms kaip „Hadoop“.
„MapReduce“ ir agregavimo vamzdynas yra du metodai, kuriuos galite naudoti sudėtingam duomenų apdorojimui MongoDB. Agregavimo sistema yra naujesnė ir žinoma dėl savo efektyvumo. Tačiau kai kurie kūrėjai vis tiek nori laikytis MapReduce, kuris, jų nuomone, yra patogesnis.
Praktiškai norite pasirinkti vieną iš šių sudėtingų užklausos metodų, nes jie pasiekia tą patį tikslą. Bet kaip jie veikia? Kuo jie skiriasi ir kuriuos turėtumėte naudoti?
Kaip MapReduce veikia MongoDB
„MapReduce“ MongoDB leidžia atlikti sudėtingus didelio duomenų kiekio skaičiavimus ir apibendrinti rezultatą į išsamesnę dalį. MapReduce metodas turi dvi funkcijas: atvaizduoti ir sumažinti.
Dirbdami su „MapReduce“ MongoDB, žemėlapį ir mažinimo funkcijas nurodysite atskirai naudodami „JavaScript“ ir kiekvieną įterpsite į integruotą žemėlapisSumažinti užklausą.
Žemėlapio funkcija pirmiausia padalija gaunamus duomenis į raktų ir reikšmių poras – dažniausiai remiantis susietu grupavimu. Čia nurodote, kaip norite grupuoti duomenis. Tada sumažinimo funkcija atlieka pasirinktinius kiekvienos duomenų grupės verčių skaičiavimus ir sujungia rezultatą į atskirą duomenų bazėje saugomą rinkinį.
Kaip agregavimo vamzdynas veikia MongoDB
„MongoDB“ agregavimo vamzdynas yra patobulinta „MapReduce“ alternatyva. Kaip ir MapReduce, ji leidžia atlikti sudėtingus skaičiavimus ir duomenų transformacijas tiesiai duomenų bazėje. Tačiau agreguojant nereikia rašyti specialių „JavaScript“ funkcijų, kurios gali sumažinti užklausos našumą.
Vietoj to, jis naudoja įtaisytuosius MongoDB operatorius duomenims valdyti, grupuoti ir skaičiuoti. Tada jis apibendrina rezultatus po kiekvienos užklausos. Taigi, agregavimo konvejerį galima labiau pritaikyti, nes galite struktūrizuoti išvestį taip, kaip norite.
Kuo užklausos skiriasi tarp „MapReduce“ ir „Aggregation“.
Tarkime, kad norite apskaičiuoti bendrą prekių pardavimą pagal produktų kategorijas. MapReduce ir agregavimo atveju produktų kategorijos tampa raktais, o kiekvienos kategorijos prekių sumos tampa atitinkamomis reikšmėmis.
Paimkite keletą neapdorotų aprašyto problemos teiginių duomenų, kurie atrodo taip:
Išspręskime šį problemos scenarijų naudodami „MapReduce“ ir agregavimo vamzdyną, kad atskirtume jų užklausas ir problemų sprendimo būdus.
„MapReduce“ metodas
Naudojant Python kaip pagrindinę programavimo kalbą, žemėlapisSumažinti anksčiau aprašyto problemos scenarijaus užklausa atrodo taip:
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)
Jei paleisite tai pagal pradinius duomenų pavyzdžius, pamatysite tokią išvestį:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Atidžiai pažiūrėkite ir turėtumėte pamatyti, kad žemėlapis ir sumažinimo procesoriai yra JavaScript funkcijos Python kintamųjų viduje. Kodas perduoda juos žemėlapisSumažinti užklausa, kuri nurodo tam skirtą išvesties rinkinį (skyrius_visos).
Agregavimo vamzdyno naudojimas
Apibendrinimo dujotiekio užklausa yra ne tik sklandesnė išvestis, bet ir tiesiogesnė. Štai kaip atrodo ankstesnė operacija su agregavimo dujotiekiu:
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)
Vykdant šią apibendrinimo užklausą bus pateikti šie rezultatai, kurie yra panašūs į MapReduce metodo rezultatus:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Užklausos našumas ir greitis
Surinkimo dujotiekis yra atnaujinta MapReduce versija. „MongoDB“ rekomenduoja vietoj „MapReduce“ naudoti agregavimo dujotiekį, nes pirmasis yra efektyvesnis.
Bandėme patvirtinti šį teiginį vykdydami užklausas ankstesniame skyriuje. Ir kai jis buvo vykdomas greta 12 GB RAM įrenginyje, agregavimo dujotiekis pasirodė greitesnis – vidutiniškai 0,014 sekundės vykdymo metu. Tam pačiam įrenginiui „MapReduce“ užklausai vykdyti vidutiniškai prireikė 0,058 sekundės.
Tai nėra kriterijus, leidžiantis daryti išvadą apie jų pasirodymus, tačiau atrodo, kad tai patvirtina MongoDB rekomendaciją. Galite manyti, kad šis laiko skirtumas yra nereikšmingas, tačiau jis labai padidės tūkstančiuose ar milijonuose užklausų.
„MapReduce“ privalumai ir trūkumai
Apsvarstykite „MapReduce“ pranašumus ir trūkumus, kad nustatytumėte, kur ji pasižymi duomenų apdorojimu.
Argumentai "už"
- Tai suteikia daugiau lankstumo tinkinant, nes rašote žemėlapį ir sumažinate funkcijas atskirai.
- Galite lengvai išsaugoti išvestį į naują MongoDB kolekciją duomenų bazėje.
- Tu gali naudoti „MapReduce“ paskirstytose failų sistemose kaip Hadoop, kuris lengvai integruojamas su MongoDB.
- Trečiųjų šalių scenarijų palaikymas daro jį labiau keičiamą ir lengviau išmokstamą nei agregavimo vamzdynas. Taigi asmuo, turintis „JavaScript“ kūrimo pagrindą, gali įdiegti „MapReduce“.
Minusai
- Tam reikia trečiosios šalies scenarijų; tai prisideda prie mažesnio našumo nei agregavimo vamzdyno.
- „MapReduce“ gali būti neefektyvi atmintis, todėl reikia kelių mazgų, ypač kai dirbama su pernelyg sudėtingais duomenimis.
- Tai netinka duomenų apdorojimui realiuoju laiku, nes užklausos gali būti lėtos.
Agregavimo vamzdyno privalumai ir trūkumai
O kaip su agregavimo vamzdynu? Atsižvelgdami į jo stipriąsias ir silpnąsias puses, galite geriau suprasti.
Argumentai "už"
- Užklausa yra daugiapakopė, dažniausiai trumpesnė, glaustesnė ir lengviau skaitoma.
- Sujungimo dujotiekis yra efektyvesnis ir siūlo reikšmingą patobulinimą, palyginti su „MapReduce“.
- Jis palaiko įmontuotus MongoDB operatorius, leidžiančius lanksčiai kurti užklausą.
- Jis palaiko duomenų apdorojimą realiuoju laiku.
- Agregavimo vamzdynas yra lengvai įtraukiamas į MongoDB ir jam nereikia trečiosios šalies scenarijų.
- Tu gali sukurti naują MongoDB kolekciją išvestims, jei reikia juos išsaugoti.
Minusai
- Ji gali būti ne tokia lanksti kaip MapReduce, kai dirbama su sudėtingesnėmis duomenų struktūromis. Kadangi jame nenaudojamas trečiosios šalies scenarijus, jis apriboja konkretų duomenų kaupimo metodą.
- Jo įgyvendinimas ir mokymosi kreivė gali būti sudėtinga kūrėjams, neturintiems arba neturintiems patirties su MongoDB.
Kada turėtumėte naudoti „MapReduce“ arba „Aggregation Pipeline“?
Paprastai geriausia atsižvelgti į duomenų apdorojimo reikalavimus renkantis tarp „MapReduce“ ir agregavimo vamzdyno.
Idealiu atveju, jei jūsų duomenys yra sudėtingesni, jiems reikalinga pažangi logika ir algoritmai paskirstytoje failų sistemoje, „MapReduce“ gali būti naudinga. Taip yra todėl, kad galite lengvai tinkinti žemėlapio mažinimo funkcijas ir įterpti jas į kelis mazgus. Pasirinkite MapReduce, jei jūsų duomenų apdorojimo užduotis reikalauja horizontalaus mastelio, o ne efektyvumo.
Kita vertus, agregavimo dujotiekis labiau tinka sudėtingiems duomenims, kuriems nereikia tinkintos logikos ar algoritmų, apskaičiuoti. Jei jūsų duomenys yra tik MongoDB, prasminga naudoti agregavimo konvejerį, nes jame yra daug integruotų operatorių.
Agregavimo dujotiekis taip pat geriausiai tinka duomenims apdoroti realiuoju laiku. Jei jūsų skaičiavimo reikalavimas teikia pirmenybę efektyvumui, o ne kitiems veiksniams, norite pasirinkti agregavimo dujotiekį.
Vykdykite sudėtingus skaičiavimus MongoDB
Nors abu MongoDB metodai yra didelės duomenų apdorojimo užklausos, jie turi daug skirtumų. Užuot nuskaitę duomenis prieš atlikdami skaičiavimus, kurie gali būti lėtesni, abu metodai tiesiogiai atlieka duomenų bazėje saugomų duomenų skaičiavimus, todėl užklausos tampa efektyvesnės.
Tačiau vienas pakeičia kitą savo našumu, ir jūs atspėjote teisingai. Agregavimo vamzdynas pranoksta MapReduce efektyvumą ir našumą. Tačiau nors galbūt norėsite bet kokia kaina pakeisti „MapReduce“ agregavimo vamzdynu, vis tiek yra konkrečių taikymo sričių, kuriose „MapReduce“ naudojimas yra prasmingesnis.