Map-Reduce e pipeline di aggregazione in MongoDB
MapReduce è un metodo consolidato per parallelizzare le query di dati, ma questa alternativa può offrire ulteriori vantaggi?
MapReduce e la pipeline di aggregazione sono i due metodi che puoi utilizzare per gestire l'elaborazione complessa dei 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 cosa differiscono 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: mappare e ridurre.
Mentre lavori con MapReduce in MongoDB, specificherai la mappa e le funzioni di riduzione separatamente utilizzando JavaScript e inserirai ciascuna nella query mapReduce incorporata.
La funzione map suddivide innanzitutto i dati in ingresso in coppie chiave-valore, solitamente in base al raggruppamento mappato. Qui è dove specifichi come vuoi raggruppare i dati. La funzione di riduzione esegue quindi calcoli personalizzati sui valori in ciascun gruppo di dati e aggrega il risultato in una raccolta separata archiviata 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 gli operatori MongoDB integrati 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 Aggregazione
Supponiamo di voler calcolare le vendite totali di articoli in base alle categorie di prodotto. Nel caso di MapReduce e dell'aggregazione, le categorie di prodotti diventano le chiavi, mentre le somme degli elementi in ciascuna categoria diventano i valori corrispondenti.
Prendi alcuni esempi di dati grezzi per la dichiarazione del problema descritto, che assomigliano a questi:
Risolviamo questo scenario problematico utilizzando MapReduce e una pipeline di aggregazione per distinguere tra le loro query e i metodi di risoluzione dei problemi.
Il metodo MapReduce
Utilizzando Python come linguaggio di programmazione di base, la query mapReduce 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 rispetto ai dati di esempio originali, vedrai un output come questo:
[{
'_id': 'Adidas',
'value': 9.0
},{
'_id': 'Nike',
'value': 12.0
}]
Osserva attentamente e dovresti vedere che i processori map e reduce sono funzioni JavaScript all'interno delle variabili Python. Il codice li passa alla query mapReduce , che specifica una raccolta di output dedicata (section_totals).
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 fornirà i seguenti risultati, 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 anziché MapReduce, poiché la prima è più efficiente.
Abbiamo provato a far valere questa affermazione durante l'esecuzione delle query nella sezione precedente. E quando eseguita 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.
Questo non è un parametro per trarre conclusioni sulle loro prestazioni, ma sembra confermare la raccomandazione di MongoDB. Potresti considerare questa differenza oraria insignificante, ma si sommerà considerevolmente su 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é scrivi la mappa e riduci le funzioni separatamente.
- Puoi facilmente salvare l'output in una nuova raccolta MongoDB all'interno del database.
- Puoi utilizzare MapReduce in file system distribuiti come Hadoop, che si integra facilmente con MongoDB.
- Il supporto per script di terze parti lo rende più scalabile e facile da apprendere rispetto alla pipeline di aggregazione. Quindi qualcuno con un background di sviluppo JavaScript può implementare MapReduce.
Contro
- Richiede scripting 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 delle 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 è a più fasi, 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 assimilabile in MongoDB e non richiede scripting di terze parti.
- Puoi creare una nuova raccolta MongoDB per gli output se devi salvarli.
Contro
- Potrebbe non essere flessibile come MapReduce quando si ha a che fare con strutture dati più complesse. Poiché non utilizza script di terze parti, ti vincola a un metodo specifico di aggregazione dei dati.
- La sua implementazione e la sua curva di apprendimento possono essere impegnative per gli sviluppatori con poca o nessuna esperienza con MongoDB.
Quando dovresti utilizzare MapReduce o Aggregation Pipeline?
In generale, è 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 personalizzare facilmente 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'altro canto, la pipeline di aggregazione è più adatta per l'elaborazione 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 è ideale anche per l'elaborazione dei dati in tempo reale. Se i tuoi requisiti di calcolo danno priorità all'efficienza rispetto ad altri fattori, puoi optare 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 anche se potresti voler sostituire a tutti i costi MapReduce con la pipeline di aggregazione, ci sono ancora aree di applicazione specifiche in cui l'utilizzo di MapReduce ha più senso.
FAQ
D: Cos'altro dovrei sapere sulla pipeline di aggregazione?
La pipeline di aggregazione di MongoDB è un processo in più fasi che include la corrispondenza dei dati, il raggruppamento e l'ordinamento.
D: Quali query e comandi posso utilizzare con MongoDB?
Sebbene MongoDB sia un database NoSQL, supporta comunque molte delle operazioni con cui avrai familiarità dai tradizionali programmi RDBMS.
D: Come funzionano le funzioni Mappa e Riduci in JavaScript?
In JavaScript, map e reduce sono metodi della classe Array. Si tratta di funzioni di ordine superiore che è possibile utilizzare per creare nuove funzioni per un codice altamente flessibile e riutilizzabile.