MapReduce je zavedený spôsob paralelizácie údajových dopytov, ale môže táto alternatíva ponúknuť ešte viac výhod?
Kľúčové informácie
- MapReduce a agregačný kanál sú dve metódy na komplexné spracovanie údajov v MongoDB. Agregačný rámec je novší a efektívnejší.
- MapReduce zahŕňa špecifikáciu samostatnej mapy a redukcie funkcií pomocou JavaScriptu, zatiaľ čo agregačný kanál používa vstavané operátory MongoDB.
- Agregačný kanál odporúča MongoDB pre lepší výkon, ale MapReduce ponúka väčšiu flexibilitu a je vhodný pre distribuované súborové systémy ako Hadoop.
MapReduce a agregačný kanál sú dve metódy, ktoré môžete použiť na riešenie zložitého spracovania údajov v MongoDB. Agregačný rámec je novší a známy svojou efektívnosťou. Niektorí vývojári sa však stále radšej držia MapReduce, ktorý považujú za pohodlnejší.
Prakticky si chcete vybrať jednu z týchto zložitých metód dotazovania, pretože dosahujú rovnaký cieľ. Ale ako fungujú? Ako sa líšia a ktoré by ste mali použiť?
Ako funguje MapReduce v MongoDB
MapReduce v MongoDB vám umožňuje spúšťať zložité výpočty na veľkom objeme údajov a agregovať výsledok do komplexnejšieho bloku. Metóda MapReduce má dve funkcie: mapovať a zmenšovať.
Pri práci s MapReduce v MongoDB určíte mapu a funkcie zmenšenia oddelene pomocou JavaScriptu a každú vložíte do vstavaného mapReduce dopyt.
Funkcia mapy najprv rozdelí prichádzajúce údaje na páry kľúč – hodnota – zvyčajne na základe mapovaného zoskupenia. Tu určíte, ako chcete zoskupiť údaje. Funkcia redukcie potom spustí vlastné výpočty s hodnotami v každej skupine údajov a agreguje výsledok do samostatnej kolekcie uloženej v databáze.
Ako funguje agregačný kanál v MongoDB
Agregačný kanál v MongoDB je vylepšenou alternatívou k MapReduce. Podobne ako MapReduce vám umožňuje vykonávať zložité výpočty a transformácie údajov priamo v databáze. Agregácia však nevyžaduje písanie vyhradených funkcií JavaScript, ktoré môžu znížiť výkon dotazov.
Namiesto toho používa vstavané operátory MongoDB na manipuláciu, zoskupovanie a výpočet údajov. Potom agreguje výsledky po každom dotaze. Potrubie agregácie je teda prispôsobiteľnejšie, pretože výstup môžete štruktúrovať tak, ako chcete.
Ako sa dopyty líšia medzi MapReduce a Aggregation
Predpokladajme, že chcete vypočítať celkový predaj položiek na základe kategórií produktov. V prípade MapReduce a agregácie sa kategórie produktov stávajú kľúčmi, zatiaľ čo súčty položiek v každej kategórii sa stávajú zodpovedajúcimi hodnotami.
Vezmite si niekoľko príkladov nespracovaných údajov pre popísané vyhlásenie o probléme, ktoré vyzerá takto:
Vyriešme tento problémový scenár pomocou MapReduce a agregačného kanála na rozlíšenie medzi ich dopytmi a metódami riešenia problémov.
Metóda MapReduce
Pri použití Pythonu ako základného programovacieho jazyka mapReduce dotaz na predtým popísaný problémový scenár vyzerá takto:
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)
Ak to spustíte s pôvodnými vzorovými údajmi, výstup sa zobrazí takto:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Pozrite sa pozorne a mali by ste vidieť, že procesory mapy a redukcie sú JavaScript funkcie vnútri premenných Pythonu. Kód ich odovzdá do mapReduce dotaz, ktorý špecifikuje vyhradenú výstupnú kolekciu (section_totals).
Použitie agregačného potrubia
Okrem plynulejšieho výstupu je dopyt agregačného kanála priamejší. Takto vyzerá predchádzajúca operácia s agregačným potrubím:
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)
Spustenie tohto agregačného dotazu poskytne nasledujúce výsledky, ktoré sú podobné výsledkom z prístupu MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Výkon a rýchlosť dotazu
Agregačný kanál je aktualizovaná verzia MapReduce. MongoDB odporúča použiť agregačný kanál namiesto MapReduce, pretože prvý je efektívnejší.
Tento nárok sme sa pokúsili uplatniť pri spustení dopytov v predchádzajúcej časti. A keď sa vykonávali vedľa seba na 12 GB RAM stroji, agregačný kanál sa zdal byť rýchlejší, v priemere 0,014 sekundy počas vykonávania. Spustenie dotazu MapReduce trvalo tomu istému stroju v priemere 0,058 sekundy.
To nie je meradlo na záver o ich výkonoch, ale zdá sa, že podporuje odporúčanie MongoDB. Tento časový rozdiel môžete považovať za nevýznamný, ale pri tisíckach alebo miliónoch dopytov sa značne zvýši.
Výhody a nevýhody MapReduce
Zvážte výhody a nevýhody MapReduce, aby ste určili, kde vyniká v spracovaní údajov.
Pros
- Poskytuje väčšiu flexibilitu pri prispôsobovaní, pretože mapu a funkcie redukujete samostatne.
- Výstup môžete ľahko uložiť do novej kolekcie MongoDB v databáze.
- Môžeš použiť MapReduce v distribuovaných súborových systémoch ako Hadoop, ktorý sa ľahko integruje s MongoDB.
- Vďaka podpore skriptovania tretích strán je škálovateľnejší a ľahšie sa učí ako agregačný kanál. Takže niekto s vývojom JavaScriptu môže implementovať MapReduce.
Zápory
- Vyžaduje skriptovanie tretích strán; to prispieva k jeho nižšej výkonnosti ako pri agregácii.
- MapReduce môže byť pamäťovo neefektívne a vyžaduje si niekoľko uzlov, najmä pri práci s príliš zložitými údajmi.
- Nie je vhodný na spracovanie údajov v reálnom čase, pretože dopytovanie môže byť pomalé.
Výhody a nevýhody agregačného potrubia
Ako je to s agregačným potrubím? Zváženie jeho silných a slabých stránok poskytuje lepší prehľad.
Pros
- Dotaz je viacstupňový, zvyčajne kratší, stručnejší a čitateľnejší.
- Agregačný kanál je efektívnejší a ponúka výrazné zlepšenie oproti MapReduce.
- Podporuje vstavané operátory MongoDB, ktoré vám umožňujú flexibilne navrhnúť váš dotaz.
- Podporuje spracovanie údajov v reálnom čase.
- Agregačný kanál je ľahko vstrebateľný do MongoDB a nevyžaduje skriptovanie tretích strán.
- Môžeš vytvorte novú kolekciu MongoDB pre výstupy, ak ich potrebujete uložiť.
Zápory
- Pri práci so zložitejšími dátovými štruktúrami nemusí byť taký flexibilný ako MapReduce. Keďže nepoužíva skriptovanie tretích strán, obmedzuje vás na špecifickú metódu agregácie údajov.
- Jeho implementácia a krivka učenia môže byť náročná pre vývojárov s malými alebo žiadnymi skúsenosťami s MongoDB.
Kedy by ste mali použiť MapReduce alebo Agregation Pipeline?
Vo všeobecnosti je najlepšie zvážiť vaše požiadavky na spracovanie údajov pri výbere medzi MapReduce a agregačným kanálom.
V ideálnom prípade, ak sú vaše údaje zložitejšie a vyžadujú pokročilú logiku a algoritmy v distribuovanom súborovom systéme, môže sa vám hodiť MapReduce. Je to preto, že si môžete jednoducho prispôsobiť funkcie zmenšenia mapy a vložiť ich do niekoľkých uzlov. Použite MapReduce, ak vaša úloha spracovania údajov vyžaduje horizontálnu škálovateľnosť pred efektívnosťou.
Na druhej strane je agregačný kanál vhodnejší na výpočet zložitých údajov, ktoré nevyžadujú vlastnú logiku alebo algoritmy. Ak sa vaše údaje nachádzajú iba v MongoDB, má zmysel použiť agregačný kanál, pretože obsahuje mnoho vstavaných operátorov.
Agregačný kanál je tiež najlepší na spracovanie údajov v reálnom čase. Ak vaša požiadavka na výpočet uprednostňuje efektivitu pred inými faktormi, chcete sa rozhodnúť pre agregačný kanál.
Spustite komplexné výpočty v MongoDB
Hoci obe metódy MongoDB sú veľkými dopytmi na spracovanie údajov, zdieľajú veľa rozdielov. Namiesto získavania údajov pred vykonaním výpočtov, ktoré môže byť pomalšie, obe metódy priamo vykonávajú výpočty s údajmi uloženými v databáze, čím sú dotazy efektívnejšie.
Jedna však výkonovo prevyšuje druhú a hádate správne. Agregačný kanál prevyšuje MapReduce v účinnosti a výkone. Ale aj keď možno budete chcieť za každú cenu nahradiť MapReduce agregačným potrubím, stále existujú špecifické oblasti použitia, v ktorých má používanie MapReduce väčší zmysel.