Domanda

Ho un mapper che, durante l'elaborazione dei dati, classifica l'output in 3 tipi diversi (il tipo è il tasto di output). Il mio obiettivo è quello di creare 3 diversi file CSV tramite i riduttori, ognuno con tutti i dati per una chiave con una riga di testa.

I valori chiave possono cambiare e sono stringhe di testo.

Ora, idealmente, vorrei avere 3 riduttori diversi e ogni riduttore otterrebbe solo una chiave con l'intero elenco di valori.

Tranne, questo non sembra funzionare perché le chiavi non vengono mappate su riduttori specifici.

La risposta a questo in altri luoghi è stata quella di scrivere una classe di partizionatore personalizzata che mappare ciascuna valore chiave desiderato a un riduttore specifico. Questo sarebbe fantastico, tranne per il fatto che ho bisogno di usare lo streaming con Python e non sono in grado di includere un barattolo di streaming personalizzato nel mio lavoro, quindi non sembra un'opzione.

Vedo nei documenti Hadoop che esiste una classe di partizione alternativa disponibile che può abilitare tipi secondari, ma non è immediatamente ovvio che sia possibile, usando il partizionatore predefinito o basato sul campo, per garantire che ogni chiave finisca sul proprio riduttore senza Scrivere una classe Java e usare un barattolo di streaming personalizzato.

Qualsiasi suggerimento sarebbe molto apprezzato.

Esempi:

Output di Mapper:

CSV2 TFIFFA, Fieldb, Fieldc CSV1 TFIELD1, Field2, Field3, Field4 CSV3 Tfieldred, Fieldgreen ...

Il problema è che se ho 3 riduttori finisco con una distribuzione chiave come questa:

reducer1        reducer2        recuder3
csv1            csv2
csv3

Un riduttore ottiene due diversi tipi di chiave e un riduttore non ottiene alcun dato. Questo perché la mod hash (chiave CSV1) Mod 3 e Hash (CHEY CSV2) MOD 3 derivano nello stesso valore.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top