2012-06-16 10 views
12

È possibile avere più ingressi con più mapper diversi in Hadoop MapReduce? Ogni classe di mappatori lavora su un diverso insieme di input, ma tutti emettono coppie chiave-valore consumate dallo stesso riduttore. Nota che non sto parlando di concatenare i mapper qui, sto parlando di far girare diversi mapper in parallelo, non in modo sequenziale.È possibile avere più input con più mapper diversi in Hadoop MapReduce?

risposta

13

Questo è chiamato join.

Si desidera utilizzare i mapper ei riduttori nei pacchetti mapred. * (Precedenti, ma ancora supportati). I pacchetti più recenti (mapreduce. *) Consentono solo un input del mapper. Con i pacchetti mapred, si utilizza la classe MultipleInputs per definire il join:

MultipleInputs.addInputPath(jobConf, 
        new Path(countsSource),  
        SequenceFileInputFormat.class, 
        CountMapper.class); 
MultipleInputs.addInputPath(jobConf, 
        new Path(dictionarySource), 
        SomeOtherInputFormat.class, 
        TranslateMapper.class); 

jobConf.setJarByClass(ReportJob.class); 
jobConf.setReducerClass(WriteTextReducer.class); 

jobConf.setMapOutputKeyClass(Text.class); 
jobConf.setMapOutputValueClass(WordInfo.class); 

jobConf.setOutputKeyClass(Text.class); 
jobConf.setOutputValueClass(Text.class); 
+5

I nuovi apis ('mapreduce' not' mapred') hanno 'MultipleInputs': http://hadoop.apache.org/common/docs/r1.0.3/api/org/apache/hadoop/mapreduce/lib /input/MultipleInputs.html –

+0

@Donald Miner: Assolutamente giusto. –

+0

@DonaldMiner Alcune versioni lo fanno, ma sembra che almeno 0.20.x non lo faccia, ad es. notare la mancanza di MultipleInputs qui: http://hadoop.apache.org/docs/r0.20.205.0/api/org/apache/hadoop/mapreduce/lib/input/ – kabuko

2

io risponderò alla tua domanda con una domanda, 2 risposte, e un anti-raccomandazione.

La domanda è: quale vantaggio si vede nell'esecuzione di processi di mappa eterogenei in parallelo, anziché eseguirli in serie, producendo risultati omogenei che possono essere mescolati correttamente? L'idea è di evitare di passare due volte gli stessi record, una volta con una mappa delle identità?

La prima risposta è quella di programmare entrambi i lavori mapper-solo contemporaneamente, ognuno su metà della vostra flotta (o qualunque rapporto di partite al meglio la dimensione dei dati di input), l'output di risultati omogenei, seguiti da un lavoro di riduttore di sola esegue il join.

La seconda risposta è creare un formato di input personalizzato in grado di riconoscere e trasformare entrambi i sapori dell'ingresso eterogeneo. Questo è estremamente brutto, ma ti permetterà di evitare la mappa dell'identità non necessaria del primo suggerimento.

L'anti-raccomandazione è quella di non utilizzare le API deprecate Hadoop dalla risposta di Chris'. Hadoop è molto giovane, ma le API si stanno stabilizzando attorno al "nuovo" sapore. Alla fine arriverete alla versione lock-in.

+0

Il motivo per l'esecuzione di diversi mapper è che è possibile implementare un'operazione di appiattimento come indicato nella carta FlumeJava. L'output dei diversi mapper può partecipare alla stessa operazione di shuffle. – tibbe

Problemi correlati