2013-08-27 18 views
6

Il partizionamento è il processo per determinare quale istanza del riduttore riceverà quali chiavi e valori intermedi. Ogni mappatore deve determinare per tutte le sue coppie di output (chiave, valore) che il riduttore le riceverà. È necessario che per ogni chiave, indipendentemente da quale istanza del programma di mapping sia stata generata, la partizione di destinazione sia la stessa. Problema: come ha fatto lo hadoop? Usa una funzione hash? qual è la funzione predefinita?Partizionamento! come fa hadoop farlo? Usa una funzione hash? qual è la funzione predefinita?

risposta

16

Il partizionatore predefinito in Hadoop è il HashPartitioner che ha un metodo chiamato getPartition. Prende key.hashCode() & Integer.MAX_VALUE e trova il modulo utilizzando il numero di operazioni di riduzione.

Ad esempio, se ci sono 10 operazioni di riduzione, getPartition restituirà i valori da 0 a 9 per tutte le chiavi.

Ecco il codice:

public class HashPartitioner<K, V> extends Partitioner<K, V> { 
    public int getPartition(K key, V value, int numReduceTasks) { 
     return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
    } 
} 

Per creare un partizionamento personalizzato, è necessario estendere Partitioner, creare un metodo getPartition, quindi impostare il vostro programma di partizionamento nel codice del driver (job.setPartitionerClass(CustomPartitioner.class);). Ciò è particolarmente utile se si eseguono operazioni di ordinamento secondario, ad esempio.

+1

capito! grazie! –

+0

@tommy_o Come viene chiamato il metodo getPartition (..)? Cosa chiama questo metodo? dove chiamare questo metodo? –

+0

@BurakKarasoy quando si crea un oggetto Job per configurare le proprietà del lavoro MR, fornirà un metodo per dichiarare CustomPartitioner se presente come specificato dall'autore sopra. Questo partizionatore personalizzato viene richiamato internamente al framework MR dopo che l'attività Map è stata completata e i dati vengono riversati sul disco –

Problemi correlati