2012-06-20 16 views
8

Ho due classi java separate per eseguire due diversi lavori di ridenorazione della mappa. Posso eseguirli in modo indipendente. I file di input su cui stanno operando sono gli stessi per entrambi i lavori. Quindi la mia domanda è se sia possibile definire due mapper e due riduttori in una classe Java comeHadoop MapReduce: è possibile definire due mapper e riduttori in una classe di lavoro hasdoop?

mapper1.class 
mapper2.class 
reducer1.class 
reducer2.class 

e poi come

job.setMapperClass(mapper1.class); 
job.setmapperClass(mapper2.class); 
job.setCombinerClass(reducer1); 
job.setCombinerClass(reducer2); 
job.setReducerClass(reducer1); 
job.setReducerClass(reducer2); 

fare questi metodi impostati in realtà ignorare i precedenti o aggiungere il nuovo quelli? Ho provato il codice, ma esegue solo le ultime lezioni date che mi portano a pensare che abbia la precedenza. Ma ci deve essere un modo per farlo giusto?

Il motivo per cui sto chiedendo questo è che posso leggere i file di input solo una volta (un I/O) e quindi elaborare due mappe ridurre i lavori. Mi piacerebbe anche sapere come posso scrivere i file di output in due cartelle diverse. Al momento, entrambi i lavori sono separati e richiedono un input e una directory di output.

risposta

1

È possibile utilizzare le classi MultipleInputs e MultipleOutputs per questo, ma l'output di entrambi i mapper andrà a entrambi i riduttori. Se i flussi di dati per le due coppie di mapper/riduttore sono realmente indipendenti l'uno dall'altro, mantenerli come due lavori separati. A proposito, MultipleInputs eseguirà i tuoi mapper senza modifiche, ma i riduttori dovrebbero essere modificati per utilizzare MultipleOutputs

+0

+1 Questo ha senso. – pyfunc

+0

@Chris Entrambe le coppie di MR condividono lo stesso input, il che mi ha fatto pensare di poter leggere l'input solo una volta. I mappatori funzionano con chiavi diverse. Ciò significa che le chiavi per un mappatore saranno diverse da quelle per l'altro mappatore. Il motivo per cui sto pensando è che posso leggere i file di input solo una volta per elaborarli in due diverse coppie di MR che funzionano in modo indipendente. – Bob

0

Secondo la mia comprensione, che deriva dall'uso di map-reduce con streaming Hadoop, puoi concatenare più mapper e riduttori in cui si consuma l'output di un altro

Ma non si dovrebbe essere in grado di eseguire contemporaneamente diversi mapper e riduttori. Gli stessi mappatori dipendono dal numero di blocchi da elaborare. Mapper deve essere istanziato in base a tale decisione e non alla varietà di mapper disponibile per il lavoro.

[Edit: Sulla base di un commento]

Non credo che sia possibile. Puoi concatenare (in cui i riduttori riceveranno tutti gli input dai mapper. Puoi eseguirli in sequenza ma non puoi eseguire esclusivamente set indipendenti di mapper e riduttori.

Penso che quello che puoi fare sia, anche se ricevi entrambi gli input da i mapper in entrambi i riduttori, è possibile rendere l'output dei mapper (K, V) è tale che è possibile distinguere nei riduttori il tipo di mapper di origine (K, V). In questo modo entrambi i riduttori possono elaborare su selettive (K, V) coppie.

+0

@Bob: ho modificato la mia risposta in base al tuo commento – pyfunc

+0

Cool, non l'ho pensato come una possibilità. Ma come posso separare i file di output, dire che posso gestirlo nella mia implementazione di riduttore, ho bisogno in qualche modo quindi di specificare quali chiavi sono scritte dove. – Bob

+0

No Bob: non puoi farlo. Quello che puoi fare in map1, map2 è presentare K, V come K, (map1, V) in modo che in riduttore tu sappia da dove provengono i dati. Ogni riduttore crea il proprio file nell'output del lavoro in modo che l'output sia già separato. – pyfunc

11

È possibile avere più mapper, ma in un processo, è possibile avere un solo riduttore. e le funzioni necessarie sono MultipleInput, MultipleOutput e GenericWritable.

Utilizzando MultipleInput, è possibile impostare il mapper e il valore di input corrispondente. Ecco il mio post su come usarlo.

Utilizzando GenericWritable, è possibile separare diverse classi di input nel riduttore. Ecco il mio post su come usarlo.

Utilizzando MultipleOutput, è possibile generare classi diverse nello stesso riduttore.

+0

Thx per il tuo commento! Li proverò. – Bob

0

La classe ChainMapper consente di utilizzare più classi Mapper all'interno di una singola attività Mappa. Ad esempio, per favore guarda here.

Problemi correlati