2010-11-13 15 views
11

Ho due file, nei seguenti formati:Come suggeriresti di eseguire "Partecipa" con lo streaming Hadoop?

field1, field2, field3 
field4, field1, field5 

un numero di campo diverso indica un significato diverso.

voglio unire i due file utilizzando Hadoop in streaming in base al campo reciproca (field1 nell'esempio di cui sopra), in modo l'uscita sarà field1, field2, field3, field4, field5 (altri ordinamenti sono ok come lungo in quanto hanno tutti i campi).

risposta

6

Hadoop ha una libreria chiamata KeyFieldBasedPartitioner http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html

Utilizzando questa come opzione nel vostro lancio lavoro come il partizionamento per il tuo lavoro lo streaming permette di rompere la vostra uscita mapper in coppie chiave/valore e le chiavi vengono hash up insieme andando alla stessa riduttore e l'ordinamento compresi i valori http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#More+Usage+Examples

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ 
-D stream.map.output.field.separator=. \ 
-D stream.num.map.output.key.fields=4 \ 
-D mapreduce.map.output.key.field.separator=. \ 
-D mapreduce.partition.keypartitioner.options=-k1,2 \ 
-D mapreduce.job.reduces=12 \ 
-input myInputDirs \ 
-output myOutputDir \ 
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \ 
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \ 
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 

Qui, -D stream.map.output.field.separator =. e -D stream.num.map.output.key.fields = 4 sono spiegati qui http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#Customizing+How+Lines+are+Split+into+Key%2FValue+Pairs in pratica sono come sono stati emessi i campi del mapper per definire le coppie chiave/valore.

I tasti di uscita della mappa del lavoro MapReduce sopra riportato hanno normalmente quattro campi separati da ".". Tuttavia, il framework MapReduce partiziona gli output della mappa dai primi due campi delle chiavi usando l'opzione -D mapreduce.partition.keypartitioner.options = -k1,2. Qui, -D mapreduce.map.output.key.field.separator =. specifica il separatore per la partizione. Ciò garantisce che tutte le coppie chiave/valore con gli stessi primi due campi nelle chiavi verranno partizionate nello stesso riduttore.

Ciò equivale in modo efficace a specificare i primi due campi come chiave primaria e i successivi due campi come secondario. La chiave primaria viene utilizzata per il partizionamento e la combinazione delle chiavi primarie e secondarie viene utilizzata per l'ordinamento.

Per fare un join è semplice come l'output dei campi dal tuo mapper e l'impostazione delle opzioni all'avvio della configurazione per i campi che sono le chiavi e il riduttore avrà tutti i tuoi valori uniti con chiave in modo appropriato . Se vuoi prendere i dati da più fonti, continua ad aggiungere più -input sulla riga di comando ... se sono lunghezze di input differenti, nel tuo mapper puoi riconoscerlo e creare un output in formato standard dal programma di mappatura.

Problemi correlati