[Teoria] Alcune domande su Hadoop-MapReduce
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
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
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
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.
"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!