MapReduce
Che cos'è MapReduce?
MapReduce è un framework di esecuzione distribuita basato su Java all'interno dell'ecosistema Apache Hadoop. Elimina la complessità della programmazione distribuita mettendo a disposizione degli sviluppatori due fasi di elaborazione da implementare: 1) Map (mappatura) e 2) Reduce (riduzione). Nella fase di mappatura, i dati vengono suddivisi in più attività di elaborazione parallela. La logica di trasformazione può essere applicata a ciascuna di queste tranche di dati. Una volta completata la mappatura, inizia la fase di riduzione, che gestisce l'aggregazione dei dati prodotti nella fase precedente. MapReduce utilizza generalmente l'Hadoop Distributed File System (HDFS) sia per l'input che per l'output. Tuttavia alcune tecnologie basate su di esso, come ad esempio Sqoop, consentono di accedere a database relazionali.
Storia di MapReduce
MapReduce è stato sviluppato nel 2004 da Jeffrey Dean e Sanjay Ghemawat, due ingegneri di Google (Dean & Ghemawat, 2004). Nel loro articolo "MAPREDUCE: SIMPLIFIED DATA PROCESSING ON LARGE CLUSTERS" si ispirano alle funzioni di map e reduce comunemente utilizzate nella programmazione funzionale. In quel periodo, il sistema proprietario di Google MapReduce veniva eseguito su Google File System (GFS). Nel 2014, Google non utilizzava più MapReduce come modello principale di elaborazione per i Big Data. In passato, MapReduce è stato l'unico metodo per recuperare i dati archiviati in HDFS, ma ora non è più così. Oggi esistono altri sistemi basati su query, come Hive e Pig, per recuperare i dati dall'HDFS utilizzando istruzioni simili a SQL che vengono eseguite insieme a job scritti utilizzando il modello MapReduce.
Come funziona MapReduce?
Un sistema MapReduce è solitamente composto da tre fasi (anche se è generalizzato come combinazione di operazioni/funzioni Map e Reduce). Le operazioni di MapReduce sono le seguenti:
- Map - I dati in ingresso vengono prima suddivisi in blocchi più piccoli. Il framework Hadoop decide quindi quanti mapper utilizzare, in base alla dimensione dei dati da elaborare e al blocco di memoria disponibile su ciascun server di mappatura. Ogni blocco viene quindi assegnato a un mapper per l'elaborazione. Ogni nodo "worker" applica la funzione map ai dati locali e scrive l'output in una memoria temporanea. Il nodo primario (master) assicura che venga elaborata una sola copia dei dati di ingresso ridondanti.
- Shuffle, Combine e Partition - I nodi worker ridistribuiscono i dati in base alle chiavi di output (prodotte dalla funzione map), in modo che tutti i dati appartenenti a una chiave si trovino sullo stesso nodo worker. Come processo opzionale, è possibile eseguire il Combiner (un riduttore) individualmente su ciascun server di mappatura per ridurre ulteriormente l'impronta dei dati e rendere più agevoli shuffle e ordinamento. La funzione Partition (non opzionale) è il processo che decide come i dati devono essere organizzati e li assegna a un particolare riduttore.
- Reduce - Un riduttore non può essere avviato mentre è ancora in funzione un mapper. I nodi worker elaborano in parallelo ciascun gruppo di coppie <chiave, valore> per restituire in uscita altre coppie <chiave, valore>. Tutti i valori di output della mappatura con la stessa chiave sono assegnati a un singolo riduttore, che aggrega i valori per quella chiave. A differenza della funzione map, che è obbligatoria per filtrare e ordinare i dati iniziali, la funzione reduce è opzionale.
Quali sono le considerazioni da fare su MapReduce?
Paradigma di programmazione Map/Reduce rigido
Sebbene l'esposizione delle interfacce Map e Reduce ai programmatori abbia semplificato la creazione di applicazioni distribuite in Hadoop, è difficile esprimere un'ampia gamma di logica in un paradigma di programmazione Map Reduce. Ad esempio, i processi iterativi sono un tipo di logica che non funziona bene in Map Reduce. In generale, i dati non vengono conservati in memoria e la logica iterativa viene gestita concatenando le applicazioni MapReduce, con conseguente aumento della complessità.
Carichi di lavoro intensivi in lettura/scrittura
I lavori MapReduce memorizzano pochi dati in memoria, poiché il sistema non prevede una struttura di memoria distribuita per i dati dell'utente. I dati devono essere letti e scritti sull'HDFS. Le applicazioni MapReduce più complesse prevedono il concatenamento di lavori MapReduce più piccoli. Dal momento che non è possibile passare i dati da un lavoro all'altro, è necessario utilizzare la funzione di data sharing dell'HDFS. Questo introduce un collo di bottiglia nell'elaborazione.
Focalizzato su Java
MapReduce è basato su Java e quindi il modo più efficiente di scrivere applicazioni nel suo ambiente è tramite Java. Il codice deve essere compilato in un ambiente di sviluppo separato e poi distribuito nel cluster Hadoop. Questo stile di sviluppo non è molto diffuso tra analisti di dati e data scientists che sono abituati ad altre tecnologie come SQL o a linguaggi interpretati come Python. MapReduce può invocare logica Map/Reduce scritta in altri linguaggi come C, Python o Shell Scripting. Per gestire l'esecuzione di questi programmi, deve però avviare un processo di sistema e questa operazione introduce un costo che influisce sulle prestazioni del job.
Progressiva scomparsa dalle offerte per i Big Data
MapReduce sta lentamente scomparendo dalle offerte per i Big Data. Sebbene alcuni fornitori lo includano ancora nelle loro distribuzioni di Hadoop, lo scopo è unicamente quello di supportare le applicazioni legacy. I clienti si sono allontanati dalla creazione di applicazioni MapReduce, adottando invece framework più semplici e veloci come Apache Spark.
Per cosa viene usato MapReduce?
Ormai solo le applicazioni legacy e gli strumenti nativi di Hadoop come Sqoop e Pig sfruttano MapReduce. Lo sviluppo di applicazioni MapReduce è molto limitato e non vi sono contributi significativi alla sua tecnologia open-source.
Preconcetti diffusi su MapReduce e Spark
- Informazioni su MapReduce
- Informazioni su Spark
Vantaggi di MapReduce
- Scalabilità
- Flessibilità
- Sicurezza e autenticazione
- Elaborazione più rapida dei dati
- Modello di programmazione molto semplice
- Disponibilità e resilienza
Semplici consigli su come migliorare le prestazioni di MapReduce
- Abilitare la modalità Uber.
- Utilizzare la libreria nativa.
- Aumentare la dimensione dei blocchi.
- Monitorare il tempo impiegato dalle attività di mappatura.
- Identificare se la compressione dei dati è frazionabile o meno.
- Impostare il numero di compiti ridotti.
- Analizzare la partizione dei dati.
- Fluttuazione delle prestazioni nella fase di shuffle.
- Ottimizzare il codice MapReduce.
MapReduce vs. Databricks Delta Engine
Databricks Delta Engine si basa su Apache Spark e su un motore C++ chiamato Photon. Di conseguenza, può contare sulla flessibilità dell'elaborazione DAG che manca a MapReduce, sulla velocità dell'elaborazione in-memory e su un motore specializzato, compilato in modo nativo, che assicura tempi di risposta alle query incredibilmente rapidi. Gli utenti possono interagire con Databricks Delta Engine utilizzando Python, Scala, R o SQL. È possibile modificare le applicazioni Spark esistenti in modo che usino Delta Engine con una semplice modifica di riga, ossia specificando "delta" come formato dei dati. MapReduce e HDFS non supportano in modo nativa la coerenza transazionale dei dati, né danno la possibilità di aggiornare/cancellare i dati esistenti all'interno dei set di dati. Delta Engine consente l'accesso simultaneo ai dati da parte di produttori e consumatori, fornendo anche funzionalità CRUD complete. Infine, MapReduce non possiede capacità integrate per gestire file di piccole dimensioni, un problema comune in qualsiasi ambiente Big Data. Databricks Delta Engine è dotato di compattazione automatica che ottimizza le dimensioni dei dati scritti sullo storage e dispone di un comando OPTIMIZE che può compattare i file su richiesta. Grazie alla funzione di coerenza transazionale di Delta, questa operazione può essere iniziata mentre gli utenti finali o le applicazioni accedono ai dati.
Le cinque migliori alternative a MapReduce
- Apache Spark
- Apache Storm
- Ceph
- Idra
- Google BigQuery