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.
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.
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:
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.
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.
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.
