MapReduce on vakiintunut tapa rinnastaa tietokyselyt, mutta voiko tämä vaihtoehto tarjota vielä enemmän etuja?

Key Takeaways

  • MapReduce ja aggregointiputki ovat kaksi menetelmää monimutkaiseen tietojenkäsittelyyn MongoDB: ssä. Aggregointikehys on uudempi ja tehokkaampi.
  • MapReduce sisältää erillisten kartta- ja vähennystoimintojen määrittämisen JavaScriptin avulla, kun taas yhdistämisputki käyttää sisäänrakennettuja MongoDB-operaattoreita.
  • MongoDB suosittelee yhdistämisputkia paremman suorituskyvyn saavuttamiseksi, mutta MapReduce tarjoaa enemmän joustavuutta ja sopii hajautetuille tiedostojärjestelmille, kuten Hadoop.

MapReduce ja aggregointiputki ovat kaksi menetelmää, joilla voit käsitellä monimutkaista tietojenkäsittelyä MongoDB: ssä. Aggregointikehys on uudempi ja tunnettu tehokkuudestaan. Jotkut kehittäjät kuitenkin pitävät mieluummin kiinni MapReducesta, jota he pitävät mukavampana.

Käytännössä haluat valita yhden näistä monimutkaisista kyselymenetelmistä, koska niillä saavutetaan sama tavoite. Mutta miten ne toimivat? Miten ne eroavat toisistaan ​​ja mitä kannattaa käyttää?

Kuinka MapReduce toimii MongoDB: ssä

MongoDB: n MapReducen avulla voit suorittaa monimutkaisia ​​laskelmia suurelle tietomäärälle ja koota tulokset kattavammaksi osaksi. MapReduce-menetelmässä on kaksi toimintoa: kartoitus ja pienennys.

Kun työskentelet MapReducen kanssa MongoDB: ssä, määrität kartan ja pienennystoiminnot erikseen JavaScriptin avulla ja lisäät kumpikin sisäänrakennettuun karttaPienennä kysely.

Karttatoiminto jakaa ensin saapuvat tiedot avain-arvo-pareihin – yleensä kartoitetun ryhmittelyn perusteella. Tässä voit määrittää, kuinka haluat ryhmitellä tiedot. Sen jälkeen vähennystoiminto suorittaa mukautettuja laskelmia kunkin tietoryhmän arvoista ja kokoaa tuloksen tietokantaan tallennettuun erilliseen kokoelmaan.

Kuinka yhdistämisputki toimii MongoDB: ssä

MongoDB: n yhdistämisputki on parannettu vaihtoehto MapReducelle. Kuten MapReduce, sen avulla voit suorittaa monimutkaisia ​​laskelmia ja datamuunnoksia suoraan tietokannan sisällä. Kokoaminen ei kuitenkaan edellytä erityisten JavaScript-funktioiden kirjoittamista, jotka voivat heikentää kyselyn suorituskykyä.

Sen sijaan se käyttää sisäänrakennettuja MongoDB-operaattoreita tietojen käsittelemiseen, ryhmittelyyn ja laskemiseen. Sitten se kokoaa tulokset jokaisen kyselyn jälkeen. Siten yhdistämisputki on muokattavissa paremmin, koska voit jäsentää tulosteen haluamallasi tavalla.

Kuinka kyselyt eroavat MapReducen ja Aggregationin välillä

Oletetaan, että haluat laskea tuotteiden kokonaismyynnin tuoteluokkien perusteella. MapReducen ja aggregoinnin tapauksessa tuoteluokista tulee avaimia, kun taas kunkin luokan kohteiden summat vastaavat arvot.

Otetaan esimerkki raakadata kuvatulle ongelmalausekkeelle, joka näyttää tältä:

Ratkaistaan ​​tämä ongelmaskenaario MapReducen ja aggregointiputken avulla erottamaan kyselyt ja ongelmanratkaisumenetelmät.

MapReduce-menetelmä

Käyttämällä Pythonia perusohjelmointikielenä, karttaPienennä aiemmin kuvatun ongelmaskenaarion kysely näyttää tältä:

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)

Jos suoritat tämän alkuperäisiä näytetietoja vastaan, näet seuraavanlaisen tulosteen:

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

Katso tarkkaan, ja sinun pitäisi nähdä, että kartta ja vähentää prosessorit ovat JavaScript-toiminnot Python-muuttujien sisällä. Koodi välittää nämä karttaPienennä kysely, joka määrittää erillisen tuloskokoelman (section_totals).

Aggregointiputkiston käyttäminen

Sen lisäksi, että aggregointiliukuhihnan kysely on sujuvampi, se on suorempi. Tältä näyttää edellinen toiminto yhdistämisputkien kanssa:

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)

Tämän koontikyselyn suorittaminen antaa seuraavat tulokset, jotka ovat samanlaisia ​​kuin MapReduce-lähestymistavan tulokset:

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

Kyselyn suorituskyky ja nopeus

Kokoamisputki on MapReducen päivitetty versio. MongoDB suosittelee yhdistämisputkien käyttöä MapReducen sijaan, koska edellinen on tehokkaampi.

Yritimme vahvistaa tämän väitteen suorittaessamme edellisen osan kyselyitä. Ja kun se suoritettiin rinnakkain 12 Gt: n RAM-koneella, aggregointiputki näytti olevan nopeampi, keskimäärin 0,014 sekuntia suorituksen aikana. Samassa koneessa kesti keskimäärin 0,058 sekuntia MapReduce-kyselyn suorittamiseen.

Se ei ole mittapuu heidän suorituksiinsa päättelemiseen, mutta se näyttää tukevan MongoDB: n suositusta. Saatat pitää tätä aikaeroa merkityksettömänä, mutta se summautuu huomattavasti tuhansiin tai miljooniin kyselyihin.

MapReducen hyvät ja huonot puolet

Harkitse MapReducen hyvät ja huonot puolet määrittääksesi, missä se on erinomainen tietojenkäsittelyssä.

Plussat

  • Se antaa enemmän joustavuutta mukauttamiseen, koska kirjoitat kartan ja vähennät toimintoja erikseen.
  • Voit helposti tallentaa tulosteen uuteen MongoDB-kokoelmaan tietokannan sisällä.
  • Voit käyttää MapReduce hajautetuissa tiedostojärjestelmissä kuten Hadoop, joka integroituu helposti MongoDB: hen.
  • Sen tuki kolmannen osapuolen komentosarjalle tekee siitä skaalautuvamman ja helpompi oppia kuin yhdistämisputki. Joten joku, jolla on JavaScript-kehitystausta, voi ottaa käyttöön MapReducen.

Haittoja

  • Se vaatii kolmannen osapuolen komentosarjan; tämä heikentää sen suorituskykyä kuin yhdistämisputki.
  • MapReduce voi olla muistitehoton ja vaatii useita solmuja, varsinkin kun käsitellään liian monimutkaista dataa.
  • Se ei sovellu reaaliaikaiseen tietojenkäsittelyyn, koska kyselyt voivat olla hidasta.

Aggregointiputken edut ja haitat

Entä yhdistämisputki? Sen vahvuuksien ja heikkouksien huomioiminen antaa enemmän käsitystä.

Plussat

  • Kysely on monivaiheinen, yleensä lyhyempi, ytimekkäämpi ja luettavampi.
  • Yhdistelmäputki on tehokkaampi, mikä tarjoaa merkittävän parannuksen MapReduceen verrattuna.
  • Se tukee sisäänrakennettuja MongoDB-operaattoreita, joiden avulla voit suunnitella kyselysi joustavasti.
  • Se tukee reaaliaikaista tietojenkäsittelyä.
  • Kokoamisputki on helposti siirrettävissä MongoDB: hen, eikä se vaadi kolmannen osapuolen komentosarjaa.
  • Sinä pystyt Luo uusi MongoDB-kokoelma ulostuloille, jos haluat tallentaa ne.

Haittoja

  • Se ei ehkä ole yhtä joustava kuin MapReduce, kun käsitellään monimutkaisempia tietorakenteita. Koska se ei käytä kolmannen osapuolen komentosarjaa, se rajoittaa tietyn menetelmän tietojen kokoamiseen.
  • Sen käyttöönotto ja oppimiskäyrä voivat olla haastavia kehittäjille, joilla on vähän tai ei ollenkaan kokemusta MongoDB: stä.

Milloin sinun pitäisi käyttää MapReduce- tai Aggregation Pipeline -putkia?

Yleensä on parasta ottaa huomioon tietojenkäsittelyvaatimukset, kun valitset MapReducen ja yhdistämisprosessin välillä.

Ihannetapauksessa, jos tietosi ovat monimutkaisempia ja vaativat kehittynyttä logiikkaa ja algoritmeja hajautetussa tiedostojärjestelmässä, MapReduce voi olla hyödyllinen. Tämä johtuu siitä, että voit helposti mukauttaa karttavähennystoimintoja ja lisätä ne useisiin solmuihin. Valitse MapReduce, jos tietojenkäsittelytehtäväsi vaatii horisontaalista skaalautuvuutta tehokkuuden sijaan.

Toisaalta yhdistämisputki sopii paremmin monimutkaisen datan laskemiseen, joka ei vaadi mukautettua logiikkaa tai algoritmeja. Jos tietosi sijaitsevat vain MongoDB: ssä, on järkevää käyttää yhdistämisputkia, koska siinä on monia sisäänrakennettuja operaattoreita.

Yhdistelmäputki sopii parhaiten myös reaaliaikaiseen tietojenkäsittelyyn. Jos laskentavaatimuksesi asettaa tehokkuuden etusijalle muiden tekijöiden edelle, sinun kannattaa valita yhdistämisputki.

Suorita monimutkaisia ​​laskelmia MongoDB: ssä

Vaikka molemmat MongoDB-menetelmät ovat suuria tietojenkäsittelykyselyjä, niillä on paljon eroja. Sen sijaan, että noudettaisiin tiedot ennen laskelmien suorittamista, mikä voi olla hitaampaa, molemmat menetelmät suorittavat laskelmia suoraan tietokantaan tallennetulle tiedolle, mikä tekee kyselyistä tehokkaampia.

Kuitenkin toinen syrjäyttää toisen suorituskyvyssä, ja arvasit oikein. Yhdistelmä päihittää MapReducen tehokkuudessa ja suorituskyvyssä. Mutta vaikka saatat haluta korvata MapReducen aggregointiputkella hinnalla millä hyvänsä, on silti tiettyjä sovellusalueita, joilla MapReducen käyttäminen on järkevämpää.