MapReduce är ett etablerat sätt att parallellisera datafrågor, men kan detta alternativ erbjuda ännu fler fördelar?
Viktiga takeaways
- MapReduce och aggregeringspipeline är två metoder för komplex databehandling i MongoDB. Aggregeringsramverket är nyare och mer effektivt.
- MapReduce innebär att specificera separata map- och reduceringsfunktioner med JavaScript, medan aggregeringspipelinen använder inbyggda MongoDB-operatorer.
- Aggregeringspipelinen rekommenderas av MongoDB för bättre prestanda, men MapReduce erbjuder mer flexibilitet och är lämplig för distribuerade filsystem som Hadoop.
MapReduce och aggregeringspipeline är de två metoder du kan använda för att hantera komplex databehandling i MongoDB. Aggregeringsramverket är nyare och känt för sin effektivitet. Men vissa utvecklare föredrar fortfarande att hålla sig till MapReduce, som de anser vara bekvämare.
I praktiken vill du välja en av dessa komplexa frågemetoder eftersom de uppnår samma mål. Men hur fungerar de? Hur är de olika och vilka ska du använda?
Hur MapReduce fungerar i MongoDB
MapReduce i MongoDB låter dig köra komplexa beräkningar på en stor mängd data och aggregera resultatet till en mer omfattande bit. MapReduce-metoden har två funktioner: map och reduce.
När du arbetar med MapReduce i MongoDB kommer du att specificera kartan och reduceringsfunktionerna separat med hjälp av JavaScript och infoga var och en i den inbyggda mapReducera fråga.
Kartfunktionen delar först upp inkommande data i nyckel-värdepar – vanligtvis baserat på mappad gruppering. Det är här du anger hur du vill gruppera data. Reduceringsfunktionen kör sedan anpassade beräkningar på värdena i varje datagrupp och aggregerar resultatet till en separat samling lagrad i databasen.
Hur aggregationsrörledningen fungerar i MongoDB
Aggregeringspipelinen i MongoDB är ett förbättrat alternativ till MapReduce. Precis som MapReduce låter den dig utföra komplexa beräkningar och datatransformationer direkt inuti databasen. Men aggregering kräver inte att man skriver dedikerade JavaScript-funktioner som kan minska frågeprestanda.
Istället använder den inbyggda MongoDB-operatorer för att manipulera, gruppera och beräkna data. Den aggregerar sedan resultaten efter varje fråga. Således är aggregeringspipelinen mer anpassningsbar eftersom du kan strukturera utdata som du vill.
Hur frågor skiljer sig mellan MapReduce och Aggregation
Anta att du vill beräkna den totala försäljningen av varor baserat på produktkategorier. När det gäller MapReduce och aggregering blir produktkategorierna nycklarna, medan summan av artiklarna under varje kategori blir motsvarande värden.
Ta några exempel på rådata för den beskrivna problemformuleringen, som ser ut så här:
Låt oss lösa detta problemscenario med hjälp av MapReduce och en aggregeringspipeline för att skilja mellan deras frågor och problemlösningsmetoder.
MapReduce-metoden
Genom att använda Python som basprogrammeringsspråk, mapReducera frågan i det tidigare beskrivna problemscenariot ser ut så här:
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)
Om du kör detta mot den ursprungliga exempeldatan ser du utdata så här:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Titta noga, och du bör se att kartan och reducera processorer är JavaScript-funktioner inuti Python-variabler. Koden skickar dessa till mapReducera fråga, som anger en dedikerad utdatasamling (section_totals).
Använda en aggregationspipeline
Förutom att ge en jämnare utdata är aggregeringspipelinefrågan mer direkt. Så här ser den tidigare operationen ut med aggregeringspipelinen:
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)
Att köra den här aggregeringsfrågan ger följande resultat, som liknar resultaten från MapReduce-metoden:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Fråga prestanda och hastighet
Aggregeringspipelinen är en uppdaterad version av MapReduce. MongoDB rekommenderar att du använder aggregeringspipelinen istället för MapReduce, eftersom den förra är mer effektiv.
Vi försökte hävda detta påstående när vi körde frågorna i föregående avsnitt. Och när den kördes sida vid sida på en 12 GB RAM-maskin, verkade aggregeringspipelinen vara snabbare, i genomsnitt 0,014 sekunder under körningen. Det tog samma maskin i genomsnitt 0,058 sekunder att köra MapReduce-frågan.
Det är inte en måttstock för att dra slutsatser om deras prestationer, men det verkar stödja MongoDB: s rekommendation. Du kanske anser att denna tidsskillnad är obetydlig, men den kommer att läggas avsevärt över tusentals eller miljontals frågor.
För- och nackdelar med MapReduce
Tänk på fördelarna och nackdelarna med MapReduce för att avgöra var det utmärker sig inom databehandling.
Fördelar
- Det ger mer flexibilitet för anpassning eftersom du skriver kartan och reducerar funktioner separat.
- Du kan enkelt spara utdata i en ny MongoDB-samling i databasen.
- Du kan använda MapReduce i distribuerade filsystem som Hadoop, som enkelt integreras med MongoDB.
- Dess stöd för tredjepartsskript gör det mer skalbart och lätt att lära sig än aggregeringspipelinen. Så någon med JavaScript-utvecklingsbakgrund kan implementera MapReduce.
Nackdelar
- Det kräver skript från tredje part; detta bidrar till dess lägre prestanda än aggregationspipelinen.
- MapReduce kan vara minnesineffektivt och kräver flera noder, särskilt när man hanterar alltför komplexa data.
- Det är inte lämpligt för databehandling i realtid eftersom förfrågningar kan vara långsamma.
För- och nackdelar med aggregationspipelinen
Vad sägs om aggregationspipeline? Att ta hänsyn till dess styrkor och svagheter ger mer insikt.
Fördelar
- Frågan är i flera steg, vanligtvis kortare, mer koncis och mer läsbar.
- Aggregeringspipelinen är mer effektiv och erbjuder en betydande förbättring jämfört med MapReduce.
- Den stöder inbyggda MongoDB-operatörer som låter dig designa din fråga flexibelt.
- Den stöder databehandling i realtid.
- Aggregeringspipelinen är lätt att inta i MongoDB och kräver inte tredjepartsskript.
- Du kan skapa en ny MongoDB-samling för utgångarna om du behöver spara dem.
Nackdelar
- Det kanske inte är lika flexibelt som MapReduce när man hanterar mer komplexa datastrukturer. Eftersom det inte använder skript från tredje part, begränsar det dig till en specifik metod för att samla in data.
- Dess implementering och inlärningskurva kan vara utmanande för utvecklare med liten eller ingen erfarenhet av MongoDB.
När ska du använda MapReduce eller Aggregation Pipeline?
I allmänhet är det bäst att ta hänsyn till dina databehandlingskrav när du väljer mellan MapReduce och aggregeringspipelinen.
Idealiskt, om dina data är mer komplexa och kräver avancerad logik och algoritmer i ett distribuerat filsystem, kan MapReduce komma väl till pass. Detta beror på att du enkelt kan anpassa kartreducerande funktioner och injicera dem i flera noder. Gå till MapReduce om din databearbetningsuppgift kräver horisontell skalbarhet framför effektivitet.
Å andra sidan är aggregeringspipelinen mer lämpad för att beräkna komplexa data som inte kräver anpassad logik eller algoritmer. Om din data endast finns i MongoDB är det vettigt att använda aggregeringspipelinen eftersom den har många inbyggda operatörer.
Aggregeringspipelinen är också bäst för databehandling i realtid. Om ditt beräkningskrav prioriterar effektivitet framför andra faktorer, vill du välja aggregeringspipeline.
Kör komplexa beräkningar i MongoDB
Även om båda MongoDB-metoderna är frågor om big data-bearbetning, delar de många skillnader. Istället för att hämta data innan beräkningar utförs, vilket kan vara långsammare, utför båda metoderna direkt beräkningar på data som lagras i databasen, vilket gör förfrågningar mer effektiva.
Men det ena ersätter det andra i prestanda, och du gissade rätt. Aggregeringspipelinen överträffar MapReduce i effektivitet och prestanda. Men även om du kanske vill ersätta MapReduce med aggregeringspipelinen till varje pris, finns det fortfarande specifika tillämpningsområden där det är mer meningsfullt att använda MapReduce.