MapReduce er en etablert måte å parallellisere dataspørringer på, men kan dette alternativet tilby enda flere fordeler?

Viktige takeaways

  • MapReduce og aggregeringsrørledningen er to metoder for kompleks databehandling i MongoDB. Aggregeringsrammeverket er nyere og mer effektivt.
  • MapReduce innebærer å spesifisere separate kart- og reduseringsfunksjoner ved hjelp av JavaScript, mens aggregeringsrørledningen bruker innebygde MongoDB-operatører.
  • Aggregeringsrørledningen anbefales av MongoDB for bedre ytelse, men MapReduce tilbyr mer fleksibilitet og er egnet for distribuerte filsystemer som Hadoop.

MapReduce og aggregeringsrørledningen er de to metodene du kan bruke for å håndtere kompleks databehandling i MongoDB. Aggregeringsrammeverket er nyere og kjent for sin effektivitet. Men noen utviklere foretrekker fortsatt å holde seg til MapReduce, som de anser som mer behagelig.

I praksis vil du velge en av disse komplekse spørringsmetodene siden de oppnår samme mål. Men hvordan fungerer de? Hvordan er de forskjellige, og hvilke bør du bruke?

Hvordan MapReduce fungerer i MongoDB

MapReduce i MongoDB lar deg kjøre komplekse beregninger på et stort datavolum og samle resultatet til en mer omfattende del. MapReduce-metoden har to funksjoner: kart og reduser.

Mens du arbeider med MapReduce i MongoDB, spesifiserer du kartet og reduksjonsfunksjonene separat ved å bruke JavaScript og setter inn hver i den innebygde kart reduksjon spørsmål.

Kartfunksjonen deler først de innkommende dataene i nøkkel-verdi-par – vanligvis basert på kartlagt gruppering. Det er her du spesifiserer hvordan du vil gruppere dataene. Reduseringsfunksjonen kjører deretter tilpassede beregninger på verdiene i hver datagruppe og samler resultatet til en separat samling lagret i databasen.

Hvordan aggregasjonsrørledningen fungerer i MongoDB

Aggregeringsrørledningen i MongoDB er et forbedret alternativ til MapReduce. I likhet med MapReduce lar den deg utføre komplekse beregninger og datatransformasjoner direkte inne i databasen. Men aggregering krever ikke å skrive dedikerte JavaScript-funksjoner som kan redusere søkeytelsen.

I stedet bruker den innebygde MongoDB-operatører for å manipulere, gruppere og beregne data. Den samler deretter resultatene etter hvert søk. Dermed er aggregeringsrørledningen mer tilpassbar siden du kan strukturere utdataene som du vil.

Hvordan spørringer skiller seg mellom MapReduce og Aggregation

Anta at du vil beregne det totale salget av varer basert på produktkategorier. Ved MapReduce og aggregering blir produktkategoriene nøkkelen, mens summen av varene under hver kategori blir tilsvarende verdier.

Ta noen eksempler på rådata for den beskrevne problemformuleringen, som ser slik ut:

La oss løse dette problemscenarioet ved å bruke MapReduce og en aggregeringspipeline for å skille mellom deres spørringer og problemløsningsmetoder.

MapReduce-metoden

Ved å bruke Python som basisprogrammeringsspråk, kart reduksjon spørringen av det tidligere beskrevne problemscenarioet ser slik ut:

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 kjører dette mot de originale eksempeldataene, vil du se utdata som dette:

[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]

Se nøye, og du bør se at kartet og redusere prosessorer er JavaScript-funksjoner inne i Python-variabler. Koden sender disse til kart reduksjon spørring, som spesifiserer en dedikert utdatasamling (section_totals).

Bruke en aggregasjonsrørledning

I tillegg til å gi et jevnere resultat, er aggregeringspipeline-spørringen mer direkte. Slik ser den forrige operasjonen ut med aggregeringsrørledningen:

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)

Å kjøre denne aggregeringsspørringen vil gi følgende resultater, som ligner resultatene fra MapReduce-tilnærmingen:

[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]

Spørr ytelse og hastighet

Aggregeringsrørledningen er en oppdatert versjon av MapReduce. MongoDB anbefaler å bruke aggregeringsrørledningen i stedet for MapReduce, da førstnevnte er mer effektiv.

Vi prøvde å hevde denne påstanden mens vi kjørte spørringene i forrige del. Og når den ble utført side ved side på en 12 GB RAM-maskin, så aggregeringsrørledningen ut til å være raskere, i gjennomsnitt 0,014 sekunder under utførelse. Det tok den samme maskinen i gjennomsnitt 0,058 sekunder å kjøre MapReduce-spørringen.

Det er ikke en målestokk for å konkludere med deres prestasjoner, men det ser ut til å støtte MongoDBs anbefaling. Du kan vurdere denne tidsforskjellen som ubetydelig, men den vil summere seg betraktelig over tusenvis eller millioner av søk.

Fordeler og ulemper med MapReduce

Vurder fordelene og ulempene med MapReduce for å finne ut hvor det utmerker seg i databehandling.

Fordeler

  • Det gir mer fleksibilitet for tilpasning siden du skriver kartet og reduserer funksjoner separat.
  • Du kan enkelt lagre utdataene i en ny MongoDB-samling i databasen.
  • Du kan bruke MapReduce i distribuerte filsystemer som Hadoop, som enkelt integreres med MongoDB.
  • Støtten for tredjepartsskripting gjør den mer skalerbar og enkel å lære enn aggregeringsrørledningen. Så noen med JavaScript-utviklingsbakgrunn kan implementere MapReduce.

Ulemper

  • Det krever tredjeparts skripting; dette bidrar til lavere ytelse enn aggregeringsrørledningen.
  • MapReduce kan være minneineffektiv, og krever flere noder, spesielt når man arbeider med altfor komplekse data.
  • Den er ikke egnet for sanntidsdatabehandling siden spørring kan være treg.

Fordeler og ulemper med aggregasjonsrørledningen

Hva med aggregeringsrørledningen? Å vurdere styrker og svakheter gir mer innsikt.

Fordeler

  • Spørringen er flertrinnsvis, vanligvis kortere, mer konsis og mer lesbar.
  • Aggregeringsrørledningen er mer effektiv, og tilbyr en betydelig forbedring i forhold til MapReduce.
  • Den støtter innebygde MongoDB-operatører som lar deg designe spørringen din fleksibelt.
  • Den støtter databehandling i sanntid.
  • Aggregeringspipelinen kan lett tas inn i MongoDB og krever ikke tredjepartsskripting.
  • Du kan opprette en ny MongoDB-samling for utgangene hvis du trenger å lagre dem.

Ulemper

  • Det er kanskje ikke så fleksibelt som MapReduce når du arbeider med mer komplekse datastrukturer. Siden den ikke bruker tredjepartsskripting, begrenser den deg til en bestemt metode for å samle data.
  • Implementeringen og læringskurven kan være utfordrende for utviklere med liten eller ingen erfaring med MongoDB.

Når bør du bruke MapReduce eller Aggregation Pipeline?

Generelt er det best å vurdere databehandlingskravene dine når du velger mellom MapReduce og aggregeringsrørledningen.

Ideelt sett, hvis dataene dine er mer komplekse og krever avansert logikk og algoritmer i et distribuert filsystem, kan MapReduce komme godt med. Dette er fordi du enkelt kan tilpasse kartreduserende funksjoner og injisere dem i flere noder. Gå for MapReduce hvis databehandlingsoppgaven din krever horisontal skalerbarhet fremfor effektivitet.

På den annen side er aggregeringsrørledningen mer egnet for å beregne komplekse data som ikke krever tilpasset logikk eller algoritmer. Hvis dataene dine bare ligger i MongoDB, er det fornuftig å bruke aggregeringsrørledningen siden den har mange innebygde operatører.

Aggregeringsrørledningen er også best for sanntidsdatabehandling. Hvis beregningskravet ditt prioriterer effektivitet fremfor andre faktorer, vil du velge aggregeringsrørledningen.

Kjør komplekse beregninger i MongoDB

Selv om begge MongoDB-metodene er store databehandlingsspørsmål, deler de mange forskjeller. I stedet for å hente data før du utfører beregninger, som kan være tregere, utfører begge metodene direkte beregninger på dataene som er lagret i databasen, noe som gjør spørringene mer effektive.

Imidlertid erstatter den ene den andre i ytelse, og du gjettet riktig. Aggregeringsrørledningen trumfer MapReduce i effektivitet og ytelse. Men selv om du kanskje vil erstatte MapReduce med aggregeringsrørledningen for enhver pris, er det fortsatt spesifikke bruksområder hvor det er mer fornuftig å bruke MapReduce.