MapReduce je zavedený způsob paralelizace datových dotazů, ale může tato alternativa nabídnout ještě více výhod?
Klíčové věci
- MapReduce a agregační kanál jsou dvě metody pro komplexní zpracování dat v MongoDB. Agregační rámec je novější a efektivnější.
- MapReduce zahrnuje specifikaci samostatných map a funkcí redukce pomocí JavaScriptu, zatímco agregační kanál používá vestavěné operátory MongoDB.
- Agregační kanál doporučuje MongoDB pro lepší výkon, ale MapReduce nabízí větší flexibilitu a je vhodný pro distribuované souborové systémy, jako je Hadoop.
MapReduce a agregační kanál jsou dvě metody, které můžete použít k řešení složitého zpracování dat v MongoDB. Agregační rámec je novější a známý svou efektivitou. Někteří vývojáři se ale stále raději drží MapReduce, který považují za pohodlnější.
Prakticky chcete vybrat jednu z těchto komplexních metod dotazů, protože dosahují stejného cíle. Ale jak fungují? Jak se liší a které byste měli použít?
Jak MapReduce funguje v MongoDB
MapReduce v MongoDB vám umožňuje spouštět složité výpočty na velkém objemu dat a agregovat výsledek do komplexnějšího bloku. Metoda MapReduce má dvě funkce: mapovat a zmenšovat.
Při práci s MapReduce v MongoDB určíte mapu a funkce zmenšení samostatně pomocí JavaScriptu a každou vložíte do vestavěného mapReduce dotaz.
Funkce map nejprve rozdělí příchozí data na páry klíč–hodnota – obvykle na základě mapovaného seskupení. Zde určíte, jak chcete data seskupit. Funkce snížení poté spustí vlastní výpočty hodnot v každé skupině dat a agreguje výsledek do samostatné kolekce uložené v databázi.
Jak funguje agregační kanál v MongoDB
Agregační kanál v MongoDB je vylepšenou alternativou k MapReduce. Stejně jako MapReduce umožňuje provádět složité výpočty a transformace dat přímo uvnitř databáze. Agregace však nevyžaduje psaní vyhrazených funkcí JavaScriptu, které mohou snížit výkon dotazů.
Místo toho používá vestavěné operátory MongoDB k manipulaci, seskupování a výpočtu dat. Poté agreguje výsledky po každém dotazu. Potrubí agregace je tedy lépe přizpůsobitelné, protože můžete strukturovat výstup, jak chcete.
Jak se liší dotazy mezi MapReduce a Aggregation
Předpokládejme, že chcete vypočítat celkový prodej položek na základě kategorií produktů. V případě MapReduce a agregace se kategorie produktů stávají klíči, zatímco součty položek v každé kategorii se stávají odpovídajícími hodnotami.
Vezměte si několik příkladů nezpracovaných dat pro popsané prohlášení o problému, které vypadá takto:
Pojďme vyřešit tento problémový scénář pomocí MapReduce a agregačního kanálu, abychom rozlišili mezi jejich dotazy a metodami řešení problémů.
Metoda MapReduce
Použití Pythonu jako základního programovacího jazyka, mapReduce dotaz na dříve popsaný problémový scénář vypadá 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)
Pokud to spustíte proti původním ukázkovým datům, uvidíte výstup takto:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Podívejte se pozorně a měli byste vidět, že mapa a redukce jsou procesory Funkce JavaScriptu uvnitř proměnných Pythonu. Kód je předá do mapReduce dotaz, který určuje vyhrazenou výstupní kolekci (sekce_celkem).
Použití agregačního kanálu
Kromě toho, že poskytuje hladší výstup, je dotaz agregačního kanálu přímější. Takto vypadá předchozí operace s agregačním kanálem:
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)
Spuštění tohoto agregačního dotazu poskytne následující výsledky, které jsou podobné výsledkům z přístupu MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Výkon a rychlost dotazu
Agregační kanál je aktualizovanou verzí MapReduce. MongoDB doporučuje používat agregační kanál místo MapReduce, protože první je efektivnější.
Tento nárok jsme se pokusili uplatnit při spouštění dotazů v předchozí části. A při souběžném provádění na stroji s 12 GB RAM se agregační kanál zdál být rychlejší, v průměru 0,014 sekundy během provádění. Stejnému počítači trvalo spuštění dotazu MapReduce v průměru 0,058 sekundy.
To není měřítko k závěru o jejich výkonech, ale zdá se, že to podporuje doporučení MongoDB. Tento časový rozdíl můžete považovat za nevýznamný, ale v tisících nebo milionech dotazů se výrazně zvýší.
Výhody a nevýhody MapReduce
Zvažte klady a zápory MapReduce, abyste zjistili, kde vyniká ve zpracování dat.
Klady
- Poskytuje větší flexibilitu pro přizpůsobení, protože píšete mapu a redukujete funkce samostatně.
- Výstup můžete snadno uložit do nové kolekce MongoDB uvnitř databáze.
- Můžeš použít MapReduce v distribuovaných souborových systémech jako Hadoop, který se snadno integruje s MongoDB.
- Díky podpoře skriptování třetích stran je škálovatelnější a snadněji se učí než agregační kanál. MapReduce tedy může implementovat někdo, kdo má zkušenosti s vývojem JavaScriptu.
Nevýhody
- Vyžaduje skriptování třetí strany; to přispívá k jeho nižší výkonnosti než u agregačního potrubí.
- MapReduce může být paměťově neefektivní a vyžaduje několik uzlů, zejména při práci s příliš složitými daty.
- Není vhodný pro zpracování dat v reálném čase, protože dotazování může být pomalé.
Klady a zápory agregačního potrubí
Jak je to s agregačním kanálem? Zvažování jeho silných a slabých stránek poskytuje více informací.
Klady
- Dotaz je vícestupňový, obvykle kratší, výstižnější a čitelnější.
- Agregační kanál je efektivnější a nabízí výrazné zlepšení oproti MapReduce.
- Podporuje vestavěné operátory MongoDB, které vám umožní flexibilně navrhnout váš dotaz.
- Podporuje zpracování dat v reálném čase.
- Agregační kanál je snadno stravitelný do MongoDB a nevyžaduje skriptování třetích stran.
- Můžeš vytvořit novou kolekci MongoDB pro výstupy, pokud je potřebujete uložit.
Nevýhody
- Při práci se složitějšími datovými strukturami nemusí být tak flexibilní jako MapReduce. Protože nepoužívá skriptování třetích stran, omezuje vás na konkrétní metodu agregace dat.
- Jeho implementace a křivka učení může být náročná pro vývojáře s malými nebo žádnými zkušenostmi s MongoDB.
Kdy byste měli použít MapReduce nebo Agregation Pipeline?
Obecně je nejlepší zvážit vaše požadavky na zpracování dat při výběru mezi MapReduce a agregačním kanálem.
V ideálním případě, pokud jsou vaše data složitější a vyžadují pokročilou logiku a algoritmy v distribuovaném souborovém systému, může se MapReduce hodit. Je to proto, že si můžete snadno přizpůsobit funkce redukce mapy a vložit je do několika uzlů. Pokud vaše úloha zpracování dat vyžaduje horizontální škálovatelnost nad efektivitou, použijte MapReduce.
Na druhou stranu je agregační kanál vhodnější pro výpočet složitých dat, která nevyžadují vlastní logiku nebo algoritmy. Pokud jsou vaše data umístěna pouze v MongoDB, má smysl používat agregační kanál, protože obsahuje mnoho vestavěných operátorů.
Agregační kanál je také nejlepší pro zpracování dat v reálném čase. Pokud váš výpočetní požadavek upřednostňuje efektivitu před jinými faktory, chcete se rozhodnout pro agregační kanál.
Spusťte komplexní výpočty v MongoDB
Přestože obě metody MongoDB jsou dotazy na zpracování velkých dat, sdílejí mnoho rozdílů. Místo načítání dat před prováděním výpočtů, které může být pomalejší, provádějí obě metody přímo výpočty s daty uloženými v databázi, což zefektivňuje dotazy.
Jedno však výkonem předčí druhé a hádáte správně. Agregační potrubí předčí MapReduce v účinnosti a výkonu. Ale i když možná budete chtít za každou cenu nahradit MapReduce agregačním kanálem, stále existují specifické oblasti použití, kde má použití MapReduce větší smysl.