2012-08-22 13 views
6

Come posso inviare un record specifico a tutti i miei riduttori?Hadoop invia record a tutti i riduttori

Conosco la classe Partitioner e cosa fa, ma non vedo alcun modo semplice per assicurarsi che un record vada a tutti i riduttori.

In sostanza, il partizionamento ha questo metodo:

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

La mia prima idea era di avere il partizionamento e la Mapper collaborare come segue: il Mapper mantiene emettere il record di un numero di volte pari al numero di ridurre task e il Partitioner restituisce tutti gli interi (da 0 a numPartitions-1), in questo modo assicurandosi che il record raggiunga tutte le partizioni.

Esistono altri modi più intelligenti per risolvere questo problema? Ad esempio, restituisco -1 per i record che ho bisogno di inviare a tutte le partizioni e il framework lo fa per me quando vede restituito -1.

risposta

5

Il partizionamento non funziona in questo modo. Il suo compito è guardare la chiave (di solito) e il valore (raramente) per determinare a quale riduttore deve essere inviata la coppia. Questo succede dopo il mappatore e prima del riduttore.

Invece, (il mappatore) dovrebbe essere in grado di chiedere al contesto la configurazione che può rispondere al numero totale di riduttori (partizioni). Il tuo mappatore può quindi emettere una chiave complessa comprendente la chiave effettiva che desideri e un numero di partizione. Sai quante volte scrivere questo perché il mappatore può scoprire il numero di riduttori (vedi sopra). Tutto ciò che il partizionatore deve fare è scomporre il valore della chiave composta, estrarre l'indice del riduttore di destinazione e restituire tale indice.

In ogni caso, questo significa che se si utilizza questa tecnica per inviare conteggi (se si sta ordinando) o altri metadati da utilizzare successivamente nell'elaborazione, le proprie chiavi dati reali devono seguire lo stesso composto formato. In effetti, probabilmente dovrai includere nella chiave composta un indicatore che descrive il tipo di coppia chiave/valore che è (ad es. 1 = dati reali, 0 = elaborazione dei metadati).

+0

Ho anche bisogno di aggiornare questa risposta per quanto riguarda il comparatore di raggruppamento di cui avrete bisogno. –

+0

Ecco come stavo pensando anche io. Non l'ho descritto molto chiaramente e stavo anche pensando di avere un contatore nell'oggetto Partitioner per tenere traccia di qual è la prossima partizione che deve restituire. Tuttavia, non sono sicuro che questa sia una soluzione perché l'oggetto Partitioner potrebbe essere GC-ed e il contatore resettato. Per quanto riguarda il comparatore di raggruppamento, penso che ciò dipenda dalle mie esigenze che non ho descritto. Tornerò se necessario. Grazie! – Razvan