[Teoria] Alcune domande su Hadoop-MapReduce

starsuper
Salve a tutti, vi chiedo alcune delucidazioni su un argomento un po' particolare, Hadoop- MapReduce. Penso di aver capito il funzionamento e il concetto dietro ma ho forse fatto un po' di confusione studiando da diversi tutorial e da diverse fonti.

Non riesco a capire il concetto di PARTITIONER e COMBINER all'interno del processo di mapreduce.
Sappiamo che subito dopo l'operazione di map(), c'è la fase di shuffle e segue poi la reduce() phase; nella fase di shuffle viene eseguito concettualmente un sorting e un group-by, ovvero si raggruppano tutte le coppie per chiave e si ordinano in modo da poter eseguire al meglio le operazioni nel reducer().

Se si prende l'esempio di WordCount, disponibile ovunque in rete, si capisce che dopo l'operazione di map(), i miei dati intermedi erano del tipo:







ma dopo la shuffle phase e quindi prima di entrare nel reduce() sono:






ovvero si raggruppano tutte le coppie per chiave in modo che poi si possa lavorare su oggetti di tipo .

Quello che non capisco è, questa operazione di sorting e groupby viene fatta in automatico ? Perche ho visto che è disponbile l'interfaccia COMBINER che è opzionale ma che spesso è omessa e come combiner() si usa lo stesso metodo reducer().


Inoltre, cosa si intende per PARTITIONER? L'unico esempio che ho trovato del partitioner riguarda un caso in cui una volta lavorati i dati dal metodo map() si suddividono i dati in 3 collections ciascuna contenente un range di età. Da li continua che poi avremo un reducer() per ogni partition/collection.

Ma anche questo partitioner, è automatico o devo implementarlo io?

Spero di non essere stato caotico, vi metto il link a cui mi riferisco cosi potrete capire meglio i miei dubbi:

1)https://www.tutorialspoint.com/map_reduce/map_reduce_introduction.htm
2)https://www.tutorialspoint.com/hadoop/hadoop_mapreduce.htm


Grazie a tutti

Risposte
Cronovirus
Quello che ti può aiutare è scrivere tu stesso un programma map-reduce. Se lo fai vedrai che ti devi solo curare di scrivere qualsiasi cosa in termini di map e reduce, tutto il resto è gestito all'infrastruttura.

starsuper
"Cronovirus":
Quello che ti può aiutare è scrivere tu stesso un programma map-reduce. Se lo fai vedrai che ti devi solo curare di scrivere qualsiasi cosa in termini di map e reduce, tutto il resto è gestito all'infrastruttura.


Allora, ho approfondito un po' la questione ed ho una visione migliore adesso. Ho alcune domande ancora in mente pero, come:

1)Ho un mapper per ogni record del file di input? Quindi lavorano in parallelo?

2)Possiamo dire che il partitioner associa ogni record ad un rispettivo worker o reducer. Questo è fatto facendo una hash(key) nel caso standard in cui il partitioner non venga dichiarato. Altrimenti, potrei ad esempio suddividere i records per chiave, ovvero tutti i record con chiave<18 li mando ad un reducer mentre gli altri vanno al reducer 2. Quindi numero di partizioni = numero di reducers (worker) ! Giusto? Il partition lavora SEMPRE tra gli OUTPUT del mapper e la shuffle phase, GIUSTO?

3)Combiner, anche detto minireduce, è un anticamera del reducer ma non lavora su hdfs ma lavora in locale permettendo maggiore velocità e risparmi. Può quindi svolgere delle preoperazioni sui dati prima che arrivino al reducer, giusto?

4)Se io ho un input gigantesco posso usare i mapreduce in serie o pipeline, ma quindi invece di usare il reducer per ogni passaggio, userò dei combiner e solo nell'ultimo passaggio userò un reducer, corretto?

Spero di essere stato chiaro... Grazie come sempre!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.