A MapReduce egy bevált módszer az adatlekérdezések párhuzamosítására, de kínálhat-e ez az alternatíva még több előnyt?
Kulcs elvitelek
- A MapReduce és az aggregációs folyamat két módszere a MongoDB komplex adatfeldolgozásának. Az aggregációs keretrendszer újabb és hatékonyabb.
- A MapReduce magában foglalja a különálló leképezési és redukciós függvények megadását JavaScript használatával, míg az aggregációs folyamat beépített MongoDB operátorokat használ.
- Az aggregációs folyamatot a MongoDB ajánlja a jobb teljesítmény érdekében, de a MapReduce nagyobb rugalmasságot kínál, és alkalmas elosztott fájlrendszerekhez, például a Hadoophoz.
A MapReduce és az aggregációs folyamat az a két módszer, amellyel a MongoDB összetett adatfeldolgozását kezelheti. Az aggregációs keretrendszer újabb és hatékonyságáról ismert. Néhány fejlesztő azonban továbbra is inkább ragaszkodik a MapReduce-hoz, amelyet kényelmesebbnek tartanak.
Gyakorlatilag ezek közül az összetett lekérdezési módszerek közül szeretne egyet választani, mivel ugyanazt a célt érik el. De hogyan működnek? Miben különböznek egymástól, és melyiket érdemes használni?
Hogyan működik a MapReduce a MongoDB-ben
A MapReduce a MongoDB-ben lehetővé teszi összetett számítások futtatását nagy mennyiségű adaton, és az eredményeket átfogóbb darabokká összesítve. A MapReduce módszer két funkciót tartalmaz: feltérképezést és kicsinyítést.
A MapReduce használata közben a MongoDB-ben a térképet és a redukciós funkciókat külön kell megadni a JavaScript használatával, és mindegyiket be kell illeszteni a beépített térképCsökkenteni lekérdezés.
A leképezési funkció először kulcs-érték párokra bontja a bejövő adatokat – általában a leképezett csoportosítás alapján. Itt adhatja meg, hogyan szeretné csoportosítani az adatokat. A redukciós függvény ezután egyéni számításokat futtat az egyes adatcsoportok értékein, és az eredményt az adatbázisban tárolt külön gyűjteménybe összesíti.
Hogyan működik az aggregációs csővezeték a MongoDB-ben
A MongoDB összesítési folyamata a MapReduce továbbfejlesztett alternatívája. A MapReduce-hoz hasonlóan lehetővé teszi összetett számítások és adatátalakítások végrehajtását közvetlenül az adatbázison belül. Az összesítéshez azonban nincs szükség dedikált JavaScript-függvények írására, amelyek csökkenthetik a lekérdezés teljesítményét.
Ehelyett beépített MongoDB operátorokat használ az adatok manipulálására, csoportosítására és kiszámítására. Ezután minden lekérdezés után összesíti az eredményeket. Így az összesítési folyamat jobban testreszabható, mivel a kimenetet tetszés szerint strukturálhatja.
Hogyan különböznek a lekérdezések a MapReduce és az Aggregation között
Tegyük fel, hogy termékkategóriák alapján szeretné kiszámítani a cikkek teljes értékesítését. A MapReduce és az aggregáció esetén a termékkategóriák a kulcsok, míg az egyes kategóriákba tartozó tételek összegei a megfelelő értékekké.
Vegyünk néhány példa nyers adatot a leírt problémanyilatkozathoz, amely így néz ki:
Oldjuk meg ezt a problémaforgatókönyvet a MapReduce és egy aggregációs folyamat segítségével, hogy különbséget tegyünk a lekérdezések és a problémamegoldó módszerek között.
A MapReduce módszer
A Pythont alapprogramozási nyelvként használva a térképCsökkenteni a korábban leírt probléma forgatókönyv lekérdezése így néz ki:
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)
Ha ezt az eredeti mintaadatokkal futtatja, akkor a következő kimenetet fogja látni:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Nézze meg alaposan, és látnia kell, hogy a térkép és a redukciós processzorok azok JavaScript funkciók Python változókon belül. A kód ezeket továbbítja a térképCsökkenteni lekérdezés, amely egy dedikált kimeneti gyűjteményt határoz meg (section_totals).
Aggregációs csővezeték használata
Amellett, hogy simább kimenetet ad, az összesítési folyamat lekérdezése közvetlenebb is. Így néz ki az előző művelet az összesítő folyamattal:
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)
Az összesítési lekérdezés futtatása a következő eredményeket adja, amelyek hasonlóak a MapReduce megközelítés eredményeihez:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Lekérdezés teljesítmény és sebesség
Az összesítő folyamat a MapReduce frissített verziója. A MongoDB a MapReduce helyett az aggregációs folyamat használatát javasolja, mivel az előbbi hatékonyabb.
Ezt az állítást próbáltuk érvényesíteni az előző szakaszban szereplő lekérdezések futtatása közben. És amikor egy 12 GB-os RAM-os gépen egymás mellett hajtották végre, az összesítési folyamat gyorsabbnak tűnt, a végrehajtás során átlagosan 0,014 másodpercet vett igénybe. Ugyanazon gépen átlagosan 0,058 másodpercbe telt a MapReduce lekérdezés futtatása.
Ez nem mérce a teljesítményük megállapításához, de úgy tűnik, hogy alátámasztja a MongoDB ajánlását. Ezt az időeltolódást jelentéktelennek tarthatja, de ez jelentősen összeadódik több ezer vagy millió lekérdezés esetén.
A MapReduce előnyei és hátrányai
Fontolja meg a MapReduce előnyeit és hátrányait, hogy meghatározza, hol jeleskedik az adatfeldolgozásban.
Profik
- Nagyobb rugalmasságot biztosít a testreszabáshoz, mivel külön-külön írja meg a térképet és csökkenti a funkciókat.
- Könnyen mentheti a kimenetet egy új MongoDB gyűjteménybe az adatbázison belül.
- Te tudod használni MapReduce elosztott fájlrendszerekben mint a Hadoop, amely könnyen integrálható a MongoDB-vel.
- A harmadik féltől származó szkriptek támogatása skálázhatóbbá és könnyebben megtanulhatóvá teszi, mint az aggregációs folyamat. Tehát valaki JavaScript fejlesztői háttérrel tudja megvalósítani a MapReduce-t.
Hátrányok
- Harmadik féltől származó szkriptet igényel; ez hozzájárul az aggregációs csővezetéknél alacsonyabb teljesítményéhez.
- A MapReduce nem elég hatékony a memória számára, több csomópontot igényel, különösen, ha túlságosan összetett adatokkal foglalkozik.
- Nem alkalmas valós idejű adatfeldolgozásra, mivel a lekérdezés lassú lehet.
Az aggregációs csővezeték előnyei és hátrányai
Mi a helyzet az aggregációs csővezetékkel? Erősségeinek és gyengeségeinek figyelembe vétele nagyobb betekintést nyújt.
Profik
- A lekérdezés többlépcsős, általában rövidebb, tömörebb és olvashatóbb.
- Az aggregációs folyamat hatékonyabb, és jelentős javulást kínál a MapReduce-hoz képest.
- Támogatja a beépített MongoDB operátorokat, amelyek lehetővé teszik a lekérdezés rugalmas megtervezését.
- Támogatja a valós idejű adatfeldolgozást.
- Az aggregációs folyamat könnyen beilleszthető a MongoDB-be, és nem igényel harmadik féltől származó szkripteket.
- tudsz hozzon létre egy új MongoDB gyűjteményt a kimenetekhez, ha el kell menteni őket.
Hátrányok
- Előfordulhat, hogy bonyolultabb adatstruktúrák kezelésekor nem olyan rugalmas, mint a MapReduce. Mivel nem használ harmadik féltől származó szkripteket, az adatok összesítésének egy meghatározott módszerére korlátozza.
- Megvalósítása és tanulási görbéje kihívást jelenthet azoknak a fejlesztőknek, akiknek kevés vagy nincs tapasztalata a MongoDB-vel kapcsolatban.
Mikor érdemes a MapReduce-t vagy az Aggregation Pipeline-t használni?
Általában a legjobb, ha figyelembe veszi az adatfeldolgozási követelményeket, amikor a MapReduce és az összesítő folyamat között választ.
Ideális esetben, ha az adatok összetettebbek, és fejlett logikát és algoritmusokat igényelnek egy elosztott fájlrendszerben, akkor a MapReduce jól jöhet. Ennek az az oka, hogy könnyedén testre szabhatja a térképcsökkentési funkciókat, és beillesztheti őket több csomópontba. Használja a MapReduce-t, ha az adatfeldolgozási feladat horizontális méretezhetőséget igényel a hatékonyság helyett.
Másrészt az aggregációs folyamat alkalmasabb olyan összetett adatok kiszámítására, amelyekhez nincs szükség egyéni logikára vagy algoritmusokra. Ha adatai csak a MongoDB-ben találhatók, érdemes az összesítő folyamatot használni, mivel számos beépített operátort tartalmaz.
Az aggregációs folyamat a valós idejű adatfeldolgozáshoz is a legjobb. Ha a számítási követelmény a hatékonyságot részesíti előnyben más tényezőkkel szemben, akkor az összesítési folyamatot szeretné választani.
Futtasson összetett számításokat a MongoDB-ben
Bár mindkét MongoDB módszer nagy adatfeldolgozási lekérdezés, sok különbség van köztük. Ahelyett, hogy a számítások elvégzése előtt lekérnék az adatokat, ami lassabb is lehet, mindkét módszer közvetlenül végez számításokat az adatbázisban tárolt adatokon, így a lekérdezések hatékonyabbak.
Azonban az egyik felülírja a másikat teljesítményben, és jól sejtette. Az aggregációs folyamat felülmúlja a MapReduce-t hatékonyságban és teljesítményben. De bár érdemes lehet mindenáron lecserélni a MapReduce-t az aggregációs folyamatra, de még mindig vannak bizonyos alkalmazási területek, ahol a MapReduce használata értelmesebb.