2012-07-31 8 views
6

Sono un nuovo arrivato qui. Non è chiaro il motivo per cui dobbiamo essere in grado di ordinare per chiavi durante l'utilizzo di hanoop mapreduce? Dopo la fase della mappa, dobbiamo distribuire i dati corrispondenti a ciascuna chiave univoca a un certo numero di riduttori. Questo può essere fatto senza aver bisogno di ordinarlo correttamente?Dove si trova l'ordinamento utilizzato nella fase MapReduce e perché?

risposta

14

È lì, perché l'ordinamento è un trucchetto per raggruppare le chiavi. Ovviamente, se il tuo lavoro o l'algoritmo non ha bisogno di alcun ordine delle tue chiavi, allora sarai più veloce da raggruppare per qualche trucco di hashing.

Nella stessa Hadoop, esiste già una JIRA depositata per questo da anni (source). Diverse altre distribuzioni che si trovano su Hadoop hanno già queste caratteristiche, ad esempio Hanborq (lo chiamano evitamento di specie). (source)

Alla tua domanda effettiva (Perché), MapReduce era intrinsecamente un documento da parte di Google (source) in cui si afferma quanto segue:

vi possiamo garantire che all'interno di una determinata partizione, l'intermedio chiave/valore le coppie vengono elaborate in ordine crescente di chiave. Questa garanzia ordinamento rende facile per generare un file di output ordinato per partizione, che è utile quando il formato del file di output deve supportare casuali le ricerche di accesso efficienti chiave, o utenti dell'uscita trovare conveniente avere i dati ordinati.

Quindi è stata più una decisione di supporto supportare l'ordinamento, ma non solo per consentire automaticamente l'ordinamento per raggruppare le chiavi.

+0

Grazie Matt per la modifica delle fonti. –

+0

Grazie Thomas! Questo lo spiega! – user428900

+0

A mio avviso, hadoop inizia l'ordinamento iniziale con l'output della mappa che viene versato nel disco (l'ordinamento avviene prima di spostare i record per lo sversamento) successivamente unisce l'ordinamento (relativamente meno costo), e poiché dall'inizio le chiavi sono ordinate, aiuta anche i combinatori da invocare e anche le chiavi ordinate aiutano quando si richiama il riduttore, quindi l'ordinamento è una buona idea. – Kalai

1

L'ordinamento per chiave è meglio compreso se consideriamo il fatto che hadoop DISTRIBUTES processi per voi inviando chiavi diverse a macchine diverse. La versione base (semplificata) del l'idea è questa:

The reducer which a (k,v) pair is sent to = k.hashCode()%num_of_machines. 

Quindi, se hashcode di mia chiave è 10, e ho 2 macchine, la chiave verrà inviato macchina # 0, per esempio.

Quindi, la chiave ci (prima) ci fornisce un modo semplice per distribuire il calcolo.

Oltre a semplificare la distribuzione del calcolo, le chiavi ci consentono di unire record da file di dati disparati in un unico cluster. Questo è il modo in cui possiamo fare cose come il conteggio delle parole, per esempio.

Infatti, se stai scoprendo che non hai bisogno delle chiavi --- probabilmente non hai bisogno nemmeno di hadoop!

L'esempio classico (numero di parole):

Nel Hadoop "parola count" esempio, emettiamo chiavi (una chiave = una sola parola) con valori (# volte questa parola è stato visto in un segmento di testo). Ciò consente a una funzione di riduzione SINGLE di ricevere una sola parola, e quindi di aggiungere tutte le volte che è stata vista, creando un conteggio accurato delle parole.

Quindi, l'aggregazione di chiavi è ciò che consente di distribuire la fase "mappa" su più macchine in modo indipendente.Senza aggregare le chiavi allo stesso riduttore, nell'esempio del conteggio delle parole, potremmo ottenere diversi conteggi di parole per una determinata parola, poiché non c'è garanzia che un singolo riduttore riceverebbe tutti i conteggi di parole da tutti i file.

Un altro esempio:

Ora ... Diciamo che abbiamo i numeri di previdenza sociale come ids e vogliamo uscita un'aggregazione dei dati personali. Diciamo che abbiamo 2 file enormi.

ssn-> nome

ssn-> shoe_size

In questo caso, si può sfruttare la potenza di raggruppamento chiave, in modo che un nome individui e numero di scarpa sono entrambi inviati alla funzione ridurre STESSO.

Il riduttore (2) riceveranno 2 record qui:

ssn-> nome, shoe_size

L'idea è che quando si scrive mappa/ridurre i posti di lavoro, è necessario codificare i "tuple", che vengono emessi in modo tale da poter essere uniti in modo significativo, nella fase di riduzione. Qualsiasi ambiente di calcolo distribuito probabilmente, a un certo punto, dovrà combinare record calcolati in nodi diversi. Le chiavi ci danno una metodologia conveniente e scalabile per farlo.

Quindi - il fatto che siamo sicuri che i tasti SAME passino alla funzione di riduttore SAME conferma che OGNI riduttore per questo particolare numero di sicurezza sociale riceverà TUTTI i dati associati a quel numero, permettendoci di unire e produrre record di dati che includono ssn, nome e dimensione della scarpa.

Conclusione

senza distribuire tramite chiave, unendo i dati in modo richiederebbe logica dolorosamente complesso che coinvolge una sorta di intermediario dati archiviazione/caching. Hadoop semplicemente generalizza e astrae la necessità comune di "unire" i risultati dei dati da calcoli paralleli usando un pardigma familiare: chiavi e valori.