MapReduce er en etableret måde at parallelisere dataforespørgsler på, men kan dette alternativ give endnu flere fordele?
Nøgle takeaways
- MapReduce og aggregeringspipelinen er to metoder til kompleks databehandling i MongoDB. Aggregeringsrammen er nyere og mere effektiv.
- MapReduce involverer specificering af separate kort- og reducerfunktioner ved hjælp af JavaScript, mens aggregeringspipelinen bruger indbyggede MongoDB-operatører.
- Aggregeringspipelinen anbefales af MongoDB for bedre ydeevne, men MapReduce tilbyder mere fleksibilitet og er velegnet til distribuerede filsystemer som Hadoop.
MapReduce og aggregeringspipelinen er de to metoder, du kan bruge til at håndtere kompleks databehandling i MongoDB. Aggregeringsrammen er nyere og kendt for sin effektivitet. Men nogle udviklere foretrækker stadig at holde sig til MapReduce, som de anser for mere behageligt.
I praksis vil du vælge en af disse komplekse forespørgselsmetoder, da de opnår det samme mål. Men hvordan fungerer de? Hvordan er de forskellige, og hvilke skal du bruge?
Sådan fungerer MapReduce i MongoDB
MapReduce i MongoDB giver dig mulighed for at køre komplekse beregninger på en stor mængde data og aggregere resultatet til en mere omfattende del. MapReduce-metoden har to funktioner: kort og reducere.
Mens du arbejder med MapReduce i MongoDB, specificerer du kortet og reduceringsfunktionerne separat ved hjælp af JavaScript og indsætter hver i den indbyggede kortReducer forespørgsel.
Kortfunktionen opdeler først de indkommende data i nøgle-værdi-par – normalt baseret på kortlagt gruppering. Det er her du angiver, hvordan du vil gruppere dataene. Reduceringsfunktionen kører derefter tilpassede beregninger på værdierne i hver datagruppe og aggregerer resultatet i en separat samling gemt i databasen.
Hvordan aggregeringsrørledningen fungerer i MongoDB
Aggregeringspipelinen i MongoDB er et forbedret alternativ til MapReduce. Ligesom MapReduce giver det dig mulighed for at udføre komplekse beregninger og datatransformationer direkte inde i databasen. Men aggregering kræver ikke skrivning af dedikerede JavaScript-funktioner, der kan reducere forespørgselsydeevne.
I stedet bruger den indbyggede MongoDB-operatører til at manipulere, gruppere og beregne data. Det samler derefter resultaterne efter hver forespørgsel. Således er aggregeringspipelinen mere tilpasselig, da du kan strukturere outputtet, som du vil.
Hvordan forespørgsler adskiller sig mellem MapReduce og Aggregation
Antag, at du vil beregne det samlede salg af varer baseret på produktkategorier. Ved MapReduce og aggregering bliver produktkategorierne nøglerne, mens summen af varerne under hver kategori bliver de tilsvarende værdier.
Tag nogle eksempler på rådata for den beskrevne problemformulering, der ser sådan ud:
Lad os løse dette problemscenarie ved hjælp af MapReduce og en aggregeringspipeline for at skelne mellem deres forespørgsler og problemløsningsmetoder.
MapReduce-metoden
Ved at bruge Python som basisprogrammeringssprog, kortReducer forespørgslen til det tidligere beskrevne problemscenarie ser sådan ud:
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)
Hvis du kører dette mod de originale eksempeldata, vil du se output som dette:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Kig godt efter, og du bør se, at kortet og reducere processorer er JavaScript-funktioner inde i Python-variabler. Koden videregiver disse til kortReducer forespørgsel, som specificerer en dedikeret outputsamling (sektion_totaler).
Brug af en aggregationsrørledning
Ud over at give et mere jævnt output, er aggregeringspipeline-forespørgslen mere direkte. Sådan ser den tidligere operation ud 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)
Kørsel af denne aggregeringsforespørgsel vil give følgende resultater, som ligner resultaterne fra MapReduce-tilgangen:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Forespørgselsydelse og hastighed
Aggregeringspipelinen er en opdateret version af MapReduce. MongoDB anbefaler at bruge aggregeringspipelinen i stedet for MapReduce, da førstnævnte er mere effektiv.
Vi forsøgte at hævde denne påstand, mens vi kørte forespørgslerne i det foregående afsnit. Og når den blev udført side om side på en 12 GB RAM-maskine, så aggregeringspipelinen ud til at være hurtigere, i gennemsnit 0,014 sekunder under udførelsen. Det tog den samme maskine i gennemsnit 0,058 sekunder at køre MapReduce-forespørgslen.
Det er ikke en målestok for at konkludere på deres præstationer, men det ser ud til at understøtte MongoDBs anbefaling. Du vil måske betragte denne tidsforskel som ubetydelig, men den vil tælle betydeligt over tusinder eller millioner af forespørgsler.
Fordele og ulemper ved MapReduce
Overvej fordelene og ulemperne ved MapReduce for at afgøre, hvor det udmærker sig inden for databehandling.
Fordele
- Det giver mere fleksibilitet til tilpasning, da du skriver kortet og reducerer funktionerne separat.
- Du kan nemt gemme outputtet i en ny MongoDB-samling inde i databasen.
- Du kan bruge MapReduce i distribuerede filsystemer som Hadoop, som nemt integreres med MongoDB.
- Dens understøttelse af tredjepartsscripting gør den mere skalerbar og nem at lære end aggregeringspipelinen. Så en person med en JavaScript-udviklingsbaggrund kan implementere MapReduce.
Ulemper
- Det kræver tredjepartsscripting; dette bidrager til dens lavere ydeevne end aggregeringspipelinen.
- MapReduce kan være hukommelsesineffektiv og kræver flere noder, især når man har at gøre med alt for komplekse data.
- Det er ikke egnet til databehandling i realtid, da forespørgsler kan være langsom.
Fordele og ulemper ved Aggregation Pipeline
Hvad med aggregeringsrørledningen? At overveje dets styrker og svagheder giver mere indsigt.
Fordele
- Forespørgslen er i flere trin, normalt kortere, mere kortfattet og mere læsbar.
- Aggregeringspipelinen er mere effektiv og tilbyder en betydelig forbedring i forhold til MapReduce.
- Det understøtter indbyggede MongoDB-operatører, der lader dig designe din forespørgsel fleksibelt.
- Det understøtter databehandling i realtid.
- Aggregeringspipelinen kan let indtages i MongoDB og kræver ikke tredjepartsscripting.
- Du kan oprette en ny MongoDB-samling for udgangene, hvis du skal gemme dem.
Ulemper
- Det er måske ikke så fleksibelt som MapReduce, når det beskæftiger sig med mere komplekse datastrukturer. Da det ikke bruger tredjepartsscripting, begrænser det dig til en bestemt metode til at samle data.
- Dens implementering og indlæringskurve kan være udfordrende for udviklere med ringe eller ingen erfaring med MongoDB.
Hvornår skal du bruge MapReduce eller Aggregation Pipeline?
Generelt er det bedst at overveje dine databehandlingskrav, når du vælger mellem MapReduce og aggregeringspipelinen.
Ideelt set, hvis dine data er mere komplekse og kræver avanceret logik og algoritmer i et distribueret filsystem, kan MapReduce være praktisk. Dette skyldes, at du nemt kan tilpasse kort-reducerende funktioner og injicere dem i flere noder. Gå efter MapReduce, hvis din databehandlingsopgave kræver horisontal skalerbarhed frem for effektivitet.
På den anden side er aggregeringspipelinen mere velegnet til at beregne komplekse data, der ikke kræver tilpasset logik eller algoritmer. Hvis dine data kun findes i MongoDB, giver det mening at bruge aggregeringspipelinen, da den har mange indbyggede operatører.
Aggregeringspipelinen er også bedst til databehandling i realtid. Hvis dit beregningskrav prioriterer effektivitet frem for andre faktorer, vil du vælge aggregeringspipeline.
Kør komplekse beregninger i MongoDB
Selvom begge MongoDB-metoder er store databehandlingsforespørgsler, deler de mange forskelle. I stedet for at hente data før udførelse af beregninger, som kan være langsommere, udfører begge metoder direkte beregninger på de data, der er gemt i databasen, hvilket gør forespørgsler mere effektive.
Det ene afløser dog det andet i ydeevne, og du gættede rigtigt. Aggregeringspipelinen overtrumfer MapReduce i effektivitet og ydeevne. Men selvom du måske vil erstatte MapReduce med aggregeringspipelinen for enhver pris, er der stadig specifikke anvendelsesområder, hvor det giver mere mening at bruge MapReduce.