Qual è lo scopo della fase di mescolamento e ordinamento nel riduttore nella programmazione di Map Reduce?


113

Nella programmazione Map Reduce la fase di riduzione ha come sottoparti mescolamento, ordinamento e riduzione. Lo smistamento è un affare costoso.

Qual è lo scopo della fase di mescolamento e ordinamento nel riduttore nella programmazione di Map Reduce?


3
Ho sempre pensato che fosse necessario poiché l'output del mapper è l'input per il riduttore, quindi è stato ordinato in base allo spazio delle chiavi e quindi suddiviso in bucket per ciascun input del riduttore.
BasicHorizon

Risposte:


171

Prima di tutto shufflingè il processo di trasferimento dei dati dai mappatori ai riduttori, quindi penso sia ovvio che sia necessario per i riduttori, poiché altrimenti non potrebbero avere alcun input (o input da ogni mappatore) . Il mescolamento può iniziare anche prima che la fase della mappa sia terminata, per risparmiare un po 'di tempo. Ecco perché puoi vedere uno stato di riduzione maggiore dello 0% (ma inferiore al 33%) quando lo stato della mappa non è ancora al 100%.

Sortingfa risparmiare tempo al riduttore, aiutandolo a distinguere facilmente quando deve iniziare una nuova attività di riduzione. Avvia semplicemente una nuova attività di riduzione, quando la chiave successiva nei dati di input ordinati è diversa dalla precedente, per dirla semplicemente. Ogni attività di riduzione richiede un elenco di coppie chiave-valore, ma deve chiamare il metodo reduce () che accetta un input dell'elenco di chiavi (valore), quindi deve raggruppare i valori per chiave. È facile farlo, se i dati di input sono preordinati (localmente) nella fase della mappa e semplicemente ordinati per fusione nella fase di riduzione (poiché i riduttori ottengono i dati da molti mappatori).

Partitioning, che hai menzionato in una delle risposte, è un processo diverso. Determina in quale riduttore verrà inviata una coppia (chiave, valore), output della fase di mappatura. Il partizionatore predefinito utilizza un hash sulle chiavi per distribuirle alle attività di riduzione, ma puoi sovrascriverlo e utilizzare il tuo partizionatore personalizzato.

Un'ottima fonte di informazioni per questi passaggi è questo tutorial di Yahoo .

Una bella rappresentazione grafica di questo è la seguente (shuffle è chiamato "copia" in questa figura):

inserisci qui la descrizione dell'immagine

Notare che shufflinge sortingnon vengono eseguiti affatto se si specificano riduttori zero (setNumReduceTasks (0)). Quindi, il lavoro MapReduce si ferma alla fase della mappa e la fase della mappa non include alcun tipo di ordinamento (quindi anche la fase della mappa è più veloce).

AGGIORNAMENTO: Dato che stai cercando qualcosa di più ufficiale, puoi anche leggere il libro di Tom White "Hadoop: The Definitive Guide". Ecco la parte interessante della tua domanda.
Tom White è un committer di Apache Hadoop dal febbraio 2007 ed è membro della Apache Software Foundation, quindi immagino che sia abbastanza credibile e ufficiale ...


"L'ordinamento fa risparmiare tempo al riduttore, aiutandolo a distinguere facilmente quando deve iniziare una nuova attività di riduzione. Avvia semplicemente una nuova attività di riduzione, quando la chiave successiva nei dati di input ordinati è diversa dalla precedente, per dirla semplicemente." Non capisco questa parte. Mapper utilizza un partitioner per dividere localmente le perdite in partizioni, ciascuna partizione quindi invia a una riduzione. In che modo l'ordinamento aiuta qui?
MaxNevermind

1
@MaxNevermind Se hai x reduce task (partizioni), non significa che finirai per chiamare x volte il metodo reduce (). Verrà chiamato una volta per ogni chiave distinta. Quindi un'attività reduce può chiamare più volte il metodo reduce ().
vefthym

"Verrà chiamato una volta per ogni chiave distinta" Perché? Il mappatore forma le partizioni come vuole (non è necessaria una partizione per ogni chiave distinta), quindi ogni partizione va al riduttore, è sbagliato?
MaxNevermind

1
@MaxNevermind Mapper restituisce chiavi e valori, non forma partizioni. Le partizioni sono definite dal numero di attività di riduzione definite dall'utente e dall'implementazione del partizionatore. Gli output di tutti i Mapper che hanno la stessa chiave andranno allo stesso metodo reduce (). Questo non può essere cambiato. Ma ciò che può essere modificato è quali altre chiavi (se ce ne sono) verranno inserite nella stessa partizione e, quindi, saranno gestite dalla stessa attività. Un'attività reduce può chiamare la funzione reduce () più di una volta, ma solo una per ogni tasto.
vefthym

2
ok penso di averlo capito. Il mio problema era che avevo dimenticato che reduce accetta un elenco di valori come argomento non solo una coppia chiave-valore. Penso che dovresti elaborare questo nella tua risposta: "Ogni attività di riduzione richiede un elenco di coppie chiave-valore ma deve chiamare il metodo reduce che accetta un <valore> di un elenco di chiavi, quindi deve raggruppare i valori per chiave, è facile da fare se i dati di input sono preordinati in una fase di mappatura "
MaxNevermind

42

Rivediamo le fasi chiave del programma Mapreduce.

La fase della mappa viene eseguita dai mappatori. I mapping vengono eseguiti su coppie chiave / valori di input non ordinate . Ogni mappatore emette zero, una o più coppie chiave / valore di output per ciascuna coppia chiave / valore di input.

La fase di combinazione viene eseguita dai combinatori. Il combinatore dovrebbe combinare le coppie chiave / valore con la stessa chiave. Ogni combinatore può essere eseguito zero, una o più volte.

La fase di mescolamento e ordinamento viene eseguita dal framework. I dati di tutti i mappatori sono raggruppati per chiave, suddivisi tra i riduttori e ordinati per chiave. Ogni riduttore ottiene tutti i valori associati alla stessa chiave. Il programmatore può fornire funzioni di confronto personalizzate per l'ordinamento e un partitioner per la suddivisione dei dati.

Il partizionatore decide quale riduttore otterrà una particolare coppia di valori chiave.

Il riduttore ottiene coppie chiave / [lista valori] ordinate, ordinate per chiave. La lista valori contiene tutti i valori con la stessa chiave prodotta dai mappatori. Ogni riduttore emette zero, una o più coppie chiave / valore di output per ciascuna coppia chiave / valore di input .

Dai un'occhiata a questo articolo javacodegeeks di Maria Jurcovicova e l' articolo mssqltips di Datta per una migliore comprensione

Di seguito l'immagine tratta dall'articolo di safaribooksonline

inserisci qui la descrizione dell'immagine


Penso che ci sia un errore di battitura nell'immagine (che mi rendo conto sia stato copiato qui). Credo che le iestringhe in Reducers e Output dovrebbero effettivamente esserlo is.
Jeff Evans

32

Ho pensato di aggiungere solo alcuni punti mancanti nelle risposte precedenti. Questo diagramma preso da qui indica chiaramente cosa sta realmente accadendo.

inserisci qui la descrizione dell'immagine

Se ripeto ancora il vero scopo di

  • Split: migliora l'elaborazione parallela distribuendo il carico di elaborazione su diversi nodi (Mapper), il che farebbe risparmiare il tempo di elaborazione complessivo.

  • Combina: riduce l'output di ogni Mapper. Risparmierebbe il tempo impiegato per spostare i dati da un nodo a un altro.

  • Sort (Shuffle & Sort): Rende più facile per il tempo di esecuzione programmare (spawn / start) nuovi riduttori, dove mentre si passa attraverso l'elenco degli elementi ordinati, ogni volta che la chiave corrente è diversa dalla precedente, può generare un nuovo riduttore .


Dove entrerebbe il passaggio della partizione in questo grafico? Dopo la mappa e prima della combinazione?
Joel

@ Joel spero che ti riferisca al passaggio "split"?
Supun Wijerathne

No, intendo il passaggio della partizione, decide a quale riduttore inviare i dati, utilizzando un semplice modulo hash per impostazione predefinita, dopo qualche ricerca in più credo che venga dopo il passaggio di combinazione, prima di mescolare e ordinare.
Joel

1
@ Joel Non sono abbastanza chiaro cosa intendi descrivere. In poche parole, l'esatta sequenza di passaggi può essere praticamente specifica del problema. Posso dire che per alcuni scenari anche l'ordinamento non è necessario. Tornando al tuo input, se parlo specificamente del semplice esempio di conteggio di parole sopra, non vedo davvero alcuna necessità di un tale partizionamento per decidere i riduttori. Qui è abbastanza semplice generare le riduzioni per chiave. Ma posso immaginare che il tuo punto di vista possa essere valido per alcuni scenari. Francamente, non ne ho un'idea precisa e chiara.
Supun Wijerathne

4

Alcuni dei requisiti di elaborazione dei dati non richiedono affatto l'ordinamento. Syncsort aveva reso collegabile l'ordinamento in Hadoop. Ecco un bel blog di loro sull'ordinamento. Il processo di spostamento dei dati dai mappatori ai riduttori si chiama shuffling, controlla questo articolo per maggiori informazioni sullo stesso.


2

Ho sempre pensato che fosse necessario poiché l'output del mapper è l'input per il riduttore, quindi è stato ordinato in base allo spazio delle chiavi e quindi suddiviso in bucket per ciascun input del riduttore. Vuoi assicurarti che tutti gli stessi valori di una chiave finiscano nello stesso secchio andando al riduttore in modo che vengano ridotti insieme. Non ha senso inviare K1, V2 e K1, V4 a riduttori diversi poiché devono essere insieme per essere ridotti.

Ho provato a spiegarlo nel modo più semplice possibile


Se vogliamo inviare k1, v1 e k1, v4 allo stesso riduttore, possiamo mescolare. allora qual è lo scopo dell'ordinamento?
Nithin K Anil

Esegue l'ordinamento per molteplici ragioni una delle ragioni è che quando un lavoro MapReduce invia tutte le coppie KV a un riduttore se l'input non è ordinato Dovrebbe scansionare tutti gli output del Mapper per raccogliere ogni istanza di K1, VX . mentre se l'output del Mapper viene ordinato non appena K2, VX viene raccolto, sai che tutto K1, VX è stato raccolto e quel set può essere inviato a un riduttore per l'elaborazione, il vantaggio di questo è che non lo fai bisogna attendere che ogni riduttore sia pronto affinché ciascuno di essi inizi a ridursi.
BasicHorizon

Anche quando si tratta di aggregazione, se si specifica di voler Aggregare tutto K1, V1 se l'input al riduttore viene ordinato non appena il riduttore prende in carico K2, V2 sa che non esistono più istanze di K1, V1 quindi può terminare la sua aggregazione mentre se l'input del riduttore non è ordinato dovrà scansionare l'intero input per K1, V1
BasicHorizon

2

Lo shuffling è il processo mediante il quale i dati intermedi dai mappatori vengono trasferiti a 0,1 o più riduttori. Ogni riduttore riceve 1 o più chiavi e i valori associati a seconda del numero di riduttori (per un carico bilanciato). Inoltre, i valori associati a ciascuna chiave vengono ordinati localmente.


0

Ci sono solo due cose che MapReduce fa NATIVAMENTE: Ordina e (implementato per ordinamento) GroupBy scalabile.

La maggior parte delle applicazioni e dei modelli di progettazione su MapReduce vengono creati su queste due operazioni, fornite da shuffle e sort.


0

Questa è una buona lettura. Spero che sia d'aiuto. In termini di ordinamento che ti preoccupa, penso che sia per l'operazione di unione nell'ultimo passaggio di Map. Quando l'operazione di mappatura è terminata e occorre scrivere il risultato sul disco locale, verrà eseguita una fusione multipla sulle suddivisioni generate dal buffer. E per un'operazione di unione, è utile ordinare ogni partizione in anticipo.


0

Bene, in Mapreduce ci sono due frasi importanti chiamate Mapper e riduttore, entrambe sono troppo importanti, ma Riduttore è obbligatorio. In alcuni programmi i riduttori sono opzionali. Ora vieni alla tua domanda. Il mescolamento e l'ordinamento sono due operazioni importanti in Mapreduce. Il primo framework Hadoop prende dati strutturati / non strutturati e separa i dati in Key, Value.

Ora il programma Mapper separa e organizza i dati in chiavi e valori da elaborare. Genera i valori Key 2 e Value 2. Questi valori dovrebbero essere elaborati e riorganizzati nell'ordine corretto per ottenere la soluzione desiderata. Ora questo shuffle e l'ordinamento vengono eseguiti nel sistema locale (Framework se ne occupa) ed elaborati nel sistema locale dopo la pulizia del framework del processo i dati nel sistema locale. Ok

Qui usiamo combinatore e partizione anche per ottimizzare questo processo di mescolamento e ordinamento. Dopo la corretta disposizione, quei valori chiave passano a Reducer per ottenere l'output del Cliente desiderato. Infine Reducer ottiene l'output desiderato.

K1, V1 -> K2, V2 (scriveremo il programma Mapper), -> K2, V '(qui shuffle e soft i dati) -> K3, V3 Genera l'output. K4, V4.

Notare che tutti questi passaggi sono solo operazioni logiche, non modificano i dati originali.

La tua domanda: qual è lo scopo della fase di mescolamento e ordinamento nel riduttore nella programmazione Map Reduce?

Risposta breve: elaborare i dati per ottenere l'output desiderato. Lo shuffling è aggregare i dati, ridurre è ottenere l'output previsto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.