MapReduce is een gevestigde manier om dataquery's te parallelliseren, maar kan dit alternatief nog meer voordelen bieden?
Belangrijkste leerpunten
- MapReduce en de aggregatiepijplijn zijn twee methoden voor complexe gegevensverwerking in MongoDB. Het aggregatieraamwerk is nieuwer en efficiënter.
- MapReduce omvat het specificeren van afzonderlijke kaart- en reduceerfuncties met behulp van JavaScript, terwijl de aggregatiepijplijn ingebouwde MongoDB-operators gebruikt.
- De aggregatiepijplijn wordt aanbevolen door MongoDB voor betere prestaties, maar MapReduce biedt meer flexibiliteit en is geschikt voor gedistribueerde bestandssystemen zoals Hadoop.
MapReduce en de aggregatiepijplijn zijn de twee methoden die u kunt gebruiken om met complexe gegevensverwerking in MongoDB om te gaan. Het aggregatieraamwerk is nieuwer en staat bekend om zijn efficiëntie. Maar sommige ontwikkelaars houden nog steeds liever vast aan MapReduce, wat ze comfortabeler vinden.
In de praktijk wilt u een van deze complexe querymethoden kiezen, aangezien ze hetzelfde doel bereiken. Maar hoe werken ze? Hoe verschillen ze en welke moet je gebruiken?
Hoe MapReduce werkt in MongoDB
Met MapReduce in MongoDB kunt u complexe berekeningen uitvoeren op een grote hoeveelheid gegevens en het resultaat samenvoegen tot een uitgebreider stuk. De MapReduce-methode heeft twee functies: in kaart brengen en verkleinen.
Terwijl u met MapReduce in MongoDB werkt, specificeert u de kaart en de reduceerfuncties afzonderlijk met behulp van JavaScript en voegt u ze elk in de ingebouwde kaartVerminderen vraag.
De kaartfunctie splitst eerst de inkomende gegevens in sleutel-waardeparen, meestal op basis van toegewezen groepering. Hier geeft u op hoe u de gegevens wilt groeperen. De reduce-functie voert vervolgens aangepaste berekeningen uit op de waarden in elke gegevensgroep en aggregeert het resultaat in een afzonderlijke verzameling die is opgeslagen in de database.
Hoe de aggregatiepijplijn werkt in MongoDB
De aggregatiepijplijn in MongoDB is een verbeterd alternatief voor MapReduce. Net als MapReduce kunt u hiermee complexe berekeningen en gegevenstransformaties rechtstreeks in de database uitvoeren. Maar aggregatie vereist geen schrijven van speciale JavaScript-functies die de queryprestaties kunnen verminderen.
In plaats daarvan gebruikt het ingebouwde MongoDB-operators om gegevens te manipuleren, groeperen en berekenen. Vervolgens verzamelt het de resultaten na elke zoekopdracht. De aggregatiepijplijn is dus meer aanpasbaar, omdat u de uitvoer naar eigen inzicht kunt structureren.
Hoe zoekopdrachten verschillen tussen MapReduce en aggregatie
Stel dat u de totale verkoop van artikelen wilt berekenen op basis van productcategorieën. In het geval van MapReduce en aggregatie worden de productcategorieën de sleutels, terwijl de som van de items onder elke categorie de overeenkomstige waarden worden.
Neem een voorbeeld van onbewerkte gegevens voor de beschreven probleemstelling, die er als volgt uitziet:
Laten we dit probleemscenario oplossen met behulp van MapReduce en een aggregatiepijplijn om onderscheid te maken tussen hun query's en probleemoplossende methoden.
De MapReduce-methode
Door Python als basisprogrammeertaal te gebruiken, wordt het kaartVerminderen query van het eerder beschreven probleemscenario ziet er als volgt uit:
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)
Als u dit uitvoert tegen de originele voorbeeldgegevens, ziet u de uitvoer als volgt:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Kijk goed, en je zou moeten zien dat de kaart en verkleinde processors zijn JavaScript-functies binnen Python-variabelen. De code geeft deze door aan de kaartVerminderen query, die een speciale uitvoerverzameling specificeert (sectie_totalen).
Een aggregatiepijplijn gebruiken
Naast een vloeiendere uitvoer, is de query voor de aggregatiepijplijn directer. Zo ziet de vorige bewerking eruit met de aggregatiepijplijn:
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)
Het uitvoeren van deze aggregatiequery levert de volgende resultaten op, die vergelijkbaar zijn met de resultaten van de MapReduce-benadering:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Vraagprestaties en snelheid
De aggregatiepijplijn is een bijgewerkte versie van MapReduce. MongoDB raadt aan om de aggregatiepijplijn te gebruiken in plaats van MapReduce, omdat de eerste efficiënter is.
We hebben geprobeerd deze claim te bevestigen tijdens het uitvoeren van de query's in de vorige sectie. En wanneer ze naast elkaar werden uitgevoerd op een 12 GB RAM-machine, leek de aggregatiepijplijn sneller te zijn, gemiddeld 0,014 seconden tijdens uitvoering. Het kostte dezelfde machine gemiddeld 0,058 seconden om de MapReduce-query uit te voeren.
Dat is geen maatstaf om hun prestaties te concluderen, maar het lijkt de aanbeveling van MongoDB te ondersteunen. U zou dit tijdsverschil als onbeduidend kunnen beschouwen, maar het zal aanzienlijk oplopen bij duizenden of miljoenen zoekopdrachten.
De voor- en nadelen van MapReduce
Overweeg de voor- en nadelen van MapReduce om te bepalen waar het uitblinkt in gegevensverwerking.
Voordelen
- Het geeft meer flexibiliteit voor maatwerk omdat u de kaart schrijft en functies afzonderlijk reduceert.
- U kunt de uitvoer eenvoudig opslaan in een nieuwe MongoDB-verzameling in de database.
- Je kunt gebruiken MapReduce in gedistribueerde bestandssystemen zoals Hadoop, dat gemakkelijk kan worden geïntegreerd met MongoDB.
- De ondersteuning voor scripting door derden maakt het schaalbaarder en gemakkelijker te leren dan de aggregatiepijplijn. Dus iemand met een JavaScript-ontwikkelingsachtergrond kan MapReduce implementeren.
Nadelen
- Het vereist scripting van derden; dit draagt bij aan de lagere prestaties dan de aggregatiepijplijn.
- MapReduce kan geheugeninefficiënt zijn, waardoor er meerdere knooppunten nodig zijn, vooral als het gaat om te complexe gegevens.
- Het is niet geschikt voor realtime gegevensverwerking, omdat query's traag kunnen zijn.
Voors en tegens van de aggregatiepijplijn
Hoe zit het met de aggregatiepijplijn? Door de sterke en zwakke punten ervan in overweging te nemen, krijgt u meer inzicht.
Voordelen
- De query bestaat uit meerdere fasen, meestal korter, beknopter en leesbaarder.
- De aggregatiepijplijn is efficiënter en biedt een aanzienlijke verbetering ten opzichte van MapReduce.
- Het ondersteunt ingebouwde MongoDB-operators waarmee u uw query flexibel kunt ontwerpen.
- Het ondersteunt realtime gegevensverwerking.
- De aggregatiepijplijn kan eenvoudig worden opgenomen in MongoDB en vereist geen scripting van derden.
- Jij kan maak een nieuwe MongoDB-collectie voor de uitvoer als u deze moet opslaan.
Nadelen
- Het is misschien niet zo flexibel als MapReduce bij het omgaan met complexere datastructuren. Omdat het geen scripting van derden gebruikt, beperkt het u tot een specifieke methode voor het verzamelen van gegevens.
- De implementatie en leercurve kunnen een uitdaging zijn voor ontwikkelaars met weinig of geen ervaring met MongoDB.
Wanneer moet u MapReduce of Aggregation Pipeline gebruiken?
Over het algemeen is het het beste om rekening te houden met uw vereisten voor gegevensverwerking bij het kiezen tussen MapReduce en de aggregatiepijplijn.
Idealiter, als uw gegevens complexer zijn en geavanceerde logica en algoritmen in een gedistribueerd bestandssysteem vereisen, kan MapReduce van pas komen. Dit komt omdat u eenvoudig kaartverkleiningsfuncties kunt aanpassen en deze in verschillende knooppunten kunt injecteren. Ga voor MapReduce als uw gegevensverwerkingstaak horizontale schaalbaarheid boven efficiëntie vereist.
Aan de andere kant is de aggregatiepijplijn geschikter voor het berekenen van complexe gegevens waarvoor geen aangepaste logica of algoritmen nodig zijn. Als uw gegevens zich alleen in MongoDB bevinden, is het logisch om de aggregatiepijplijn te gebruiken, omdat deze veel ingebouwde operators bevat.
De aggregatiepijplijn is ook het beste voor realtime gegevensverwerking. Als uw rekenvereiste voorrang geeft aan efficiëntie boven andere factoren, wilt u kiezen voor de aggregatiepijplijn.
Voer complexe berekeningen uit in MongoDB
Hoewel beide MongoDB-methoden query's voor het verwerken van big data zijn, delen ze veel verschillen. In plaats van gegevens op te halen voordat berekeningen worden uitgevoerd, wat langzamer kan zijn, voeren beide methoden rechtstreeks berekeningen uit op de gegevens die in de database zijn opgeslagen, waardoor query's efficiënter worden.
De een vervangt de ander echter qua prestaties, en je raadt het goed. De aggregatiepijplijn overtreft MapReduce in efficiëntie en prestaties. Maar hoewel u MapReduce ten koste van alles wilt vervangen door de aggregatiepijplijn, zijn er nog steeds specifieke toepassingsgebieden waar het gebruik van MapReduce zinvoller is.