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?

instagram viewer

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.