MapReduce è un modo consolidato per parallelizzare le query di dati, ma questa alternativa può offrire ancora più vantaggi?
Punti chiave
- MapReduce e la pipeline di aggregazione sono due metodi per l'elaborazione di dati complessi in MongoDB. Il quadro di aggregazione è più nuovo e più efficiente.
- MapReduce implica la specifica di funzioni map e reduce separate utilizzando JavaScript, mentre la pipeline di aggregazione utilizza operatori MongoDB incorporati.
- La pipeline di aggregazione è consigliata da MongoDB per prestazioni migliori, ma MapReduce offre maggiore flessibilità ed è adatto per file system distribuiti come Hadoop.
MapReduce e la pipeline di aggregazione sono i due metodi che puoi utilizzare per gestire complesse elaborazioni di dati in MongoDB. Il framework di aggregazione è più recente e noto per la sua efficienza. Ma alcuni sviluppatori preferiscono ancora attenersi a MapReduce, che considerano più comodo.
In pratica, vuoi scegliere uno di questi metodi di query complessi poiché raggiungono lo stesso obiettivo. Ma come lavorano? In che modo sono diversi e quale dovresti usare?
Come funziona MapReduce in MongoDB
MapReduce in MongoDB ti consente di eseguire calcoli complessi su un grande volume di dati e aggregare il risultato in un blocco più completo. Il metodo MapReduce presenta due funzioni: map e reduce.
Mentre lavori con MapReduce in MongoDB, dovrai specificare la mappa e le funzioni reduce separatamente utilizzando JavaScript e inserirle ciascuna nel built-in Riduci mappa domanda.
La funzione map prima suddivide i dati in arrivo in coppie chiave-valore, solitamente in base al raggruppamento mappato. Qui è dove si specifica come si desidera raggruppare i dati. La funzione reduce quindi esegue calcoli personalizzati sui valori in ciascun gruppo di dati e aggrega il risultato in una raccolta separata memorizzata nel database.
Come funziona la pipeline di aggregazione in MongoDB
La pipeline di aggregazione in MongoDB è un'alternativa migliorata a MapReduce. Come MapReduce, consente di eseguire calcoli complessi e trasformazioni di dati direttamente all'interno del database. Ma l'aggregazione non richiede la scrittura di funzioni JavaScript dedicate che possono ridurre le prestazioni delle query.
Utilizza invece operatori MongoDB incorporati per manipolare, raggruppare e calcolare i dati. Quindi aggrega i risultati dopo ogni query. Pertanto, la pipeline di aggregazione è più personalizzabile poiché puoi strutturare l'output come preferisci.
In che modo le query differiscono tra MapReduce e l'aggregazione
Si supponga di voler calcolare le vendite totali degli articoli in base alle categorie di prodotti. Nel caso di MapReduce e dell'aggregazione, le categorie di prodotti diventano le chiavi, mentre le somme degli elementi di ciascuna categoria diventano i valori corrispondenti.
Prendi alcuni dati grezzi di esempio per la dichiarazione del problema descritta, che assomiglia a questo:
Risolviamo questo scenario problematico utilizzando MapReduce e una pipeline di aggregazione per distinguere tra le query e i metodi di risoluzione dei problemi.
Il metodo MapReduce
Usando Python come linguaggio di programmazione di base, il Riduci mappa la query dello scenario problematico descritto in precedenza si presenta così:
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)
Se lo esegui sui dati di esempio originali, vedrai un output come questo:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Guarda da vicino e dovresti vedere che la mappa e ridurre i processori sono Funzioni javascript all'interno delle variabili Python. Il codice passa questi al Riduci mappa query, che specifica una raccolta di output dedicata (sezione_totali).
Utilizzo di una pipeline di aggregazione
Oltre a fornire un output più fluido, la query della pipeline di aggregazione è più diretta. Ecco come appare l'operazione precedente con la pipeline di aggregazione:
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)
L'esecuzione di questa query di aggregazione darà i seguenti risultati, che sono simili ai risultati dell'approccio MapReduce:
[{
'Section': 'Nike',
'TotalSold': 12
},{
'Section': 'Adidas',
'TotalSold': 9
}]
Prestazioni e velocità delle query
La pipeline di aggregazione è una versione aggiornata di MapReduce. MongoDB consiglia di utilizzare la pipeline di aggregazione invece di MapReduce, poiché la prima è più efficiente.
Abbiamo tentato di affermare questa affermazione durante l'esecuzione delle query nella sezione precedente. E quando eseguito fianco a fianco su una macchina da 12 GB di RAM, la pipeline di aggregazione sembrava essere più veloce, con una media di 0,014 secondi durante l'esecuzione. La stessa macchina ha impiegato in media 0,058 secondi per eseguire la query MapReduce.
Non è un parametro per concludere sulle loro prestazioni, ma sembra confermare la raccomandazione di MongoDB. Potresti considerare questa differenza di tempo insignificante, ma si sommerà considerevolmente in migliaia o milioni di query.
I pro e i contro di MapReduce
Considera i vantaggi e gli svantaggi di MapReduce per determinare dove eccelle nell'elaborazione dei dati.
Professionisti
- Offre maggiore flessibilità per la personalizzazione poiché si scrive la mappa e si riducono le funzioni separatamente.
- Puoi facilmente salvare l'output in una nuova raccolta MongoDB all'interno del database.
- Puoi usare MapReduce nei file system distribuiti come Hadoop, che si integra facilmente con MongoDB.
- Il suo supporto per script di terze parti lo rende più scalabile e facile da imparare rispetto alla pipeline di aggregazione. Quindi qualcuno con un background di sviluppo JavaScript può implementare MapReduce.
Contro
- Richiede script di terze parti; ciò contribuisce alle sue prestazioni inferiori rispetto alla pipeline di aggregazione.
- MapReduce può essere inefficiente in termini di memoria, richiedendo diversi nodi, soprattutto quando si tratta di dati eccessivamente complessi.
- Non è adatto per l'elaborazione dei dati in tempo reale poiché l'esecuzione di query può essere lenta.
Pro e contro della pipeline di aggregazione
Che ne dici della pipeline di aggregazione? Considerare i suoi punti di forza e di debolezza fornisce maggiori informazioni.
Professionisti
- La query è multistadio, solitamente più breve, più concisa e più leggibile.
- La pipeline di aggregazione è più efficiente e offre un miglioramento significativo rispetto a MapReduce.
- Supporta gli operatori MongoDB integrati che ti consentono di progettare la tua query in modo flessibile.
- Supporta l'elaborazione dei dati in tempo reale.
- La pipeline di aggregazione è facilmente inseribile in MongoDB e non richiede script di terze parti.
- Puoi creare una nuova raccolta MongoDB per gli output se è necessario salvarli.
Contro
- Potrebbe non essere flessibile come MapReduce quando si tratta di strutture di dati più complesse. Poiché non utilizza script di terze parti, ti limita a un metodo specifico di aggregazione dei dati.
- La sua implementazione e la curva di apprendimento possono essere impegnative per gli sviluppatori con poca o nessuna esperienza con MongoDB.
Quando dovresti usare MapReduce o la pipeline di aggregazione?
In genere, è meglio considerare i requisiti di elaborazione dei dati quando si sceglie tra MapReduce e la pipeline di aggregazione.
Idealmente, se i tuoi dati sono più complessi e richiedono logica e algoritmi avanzati in un file system distribuito, MapReduce può tornare utile. Questo perché puoi facilmente personalizzare le funzioni di riduzione della mappa e inserirle in diversi nodi. Scegli MapReduce se la tua attività di elaborazione dei dati richiede scalabilità orizzontale piuttosto che efficienza.
D'altra parte, la pipeline di aggregazione è più adatta per il calcolo di dati complessi che non richiedono logica o algoritmi personalizzati. Se i tuoi dati risiedono solo in MongoDB, ha senso utilizzare la pipeline di aggregazione poiché presenta molti operatori integrati.
La pipeline di aggregazione è anche la migliore per l'elaborazione dei dati in tempo reale. Se il tuo requisito di calcolo dà la priorità all'efficienza rispetto ad altri fattori, opta per la pipeline di aggregazione.
Esegui calcoli complessi in MongoDB
Sebbene entrambi i metodi MongoDB siano query di elaborazione di big data, condividono molte differenze. Invece di recuperare i dati prima di eseguire i calcoli, che possono essere più lenti, entrambi i metodi eseguono direttamente i calcoli sui dati archiviati nel database, rendendo le query più efficienti.
Tuttavia, uno sostituisce l'altro in termini di prestazioni e hai indovinato. La pipeline di aggregazione supera MapReduce in termini di efficienza e prestazioni. Ma mentre potresti voler sostituire MapReduce con la pipeline di aggregazione a tutti i costi, ci sono ancora aree di applicazione specifiche in cui l'utilizzo di MapReduce ha più senso.