giovedì 12 maggio 2011

Hadoop MapReduce

MapReduce è un modello di programmazione per il data processing introdotto da Google per supportare il calcolo distribuito su grandi dataset in sistemi cluster. Come si può capire dal nome stesso, un job MapReduce consiste in task di due tipi:
1. Map: Il nodo master prende in input i dati (una coppia di key/value), estrae da essi alcuni (generando un altra coppia di key/value), creando di fatto dei sotto-problemi e gli distribuisce ai nodi worker. Quest'ultimi elaborano le informazioni e ritornano i risultati indietro ai nodi master.
2. Reduce: Il nodo master, che ha ricevuto le risposte da tutti i nodi designati all'elaborazione dei sotto-problemi, combina insieme le informazioni (unendo tutti i valori intermedi associati alla stessa chiave) e fornisce i risultati in output.
Un programma scritto seguendo queste specifiche viene automaticamente parallelizzato e può essere eseguito in un cluster commodity di grandi dimensioni. Le specifiche librerie MapReduce, infatti, tengono in conto e gestiscono automaticamente il data partitioning , lo scheduling dei job sulle diverse macchine hardware, gestiscono i failures delle macchine e le comunicazioni tra i diversi nodi di cui è composto il cluster.
Tutto ciò permette a programmatori che non hanno particolare esperienza nell'ambito del calcolo parallelo e distribuito di scrivere applicazioni che possono gestire una grande quantità di dati ed essere scalate su cluster di grandi dimensioni.
In dettaglio, ci sono due tipi di nodi che controllano il job: jobtracker e diversi tasktracker. Il jobtracker coordina tutti i job, schedulando i task ai relativi tasktracker. I tasktracker eseguono i task e inviano di tanto in tanto dei report sullo stato del processo ai jobtracker. Se un task fallisce, il jobtracker lo rischedula ad un altro tasktracer.
Hadoop divide l'input al job MapReduce in blocchi di dimensioni fisse chiamati split e crea per ogni split un task di tipo map che esegue una particolare funzione definita dallo sviluppatore per ogni record nello split.
In generale, è consigliabile avere degli split piccoli per avere un carico di lavoro bilanciato tra i diversi nodi, anche se la dimensione non deve essere inferiore ad una certa soglia (64 MB) altrimenti l'overhead per gestirli diventa più importante del tempo totale per eseguire l'operazione vera e propria.
Hadoop nel processo di map legge i dati in input da HDFS, mentre scrive i dati in output su filesystem locale in quanto questi sono risultati parziali che dovranno essere rielaborati in un secondo momento dai reducer per produrre l'output finale. Invece l'output finale prodotto dai reducer è normalmente archiviato su HDFS per garantire l'affidabilità.
MapReduce di Hadoop ha librerie scritte in differenti linguaggi di programmazione, quali : C++, C#, Java, Erlang, Ruby, Python e altri.
Esso viene usato in svariate applicazioni quali : distribuited grep, distribuited sort, web link-graph reversal, costruzione di inverted index7, document clustering e altri. In particolare MapReduce viene usato di tanto in tanto per rigenerare completamente l'indice di Google del World Wide Web.

Nessun commento:

Posta un commento