2015-07-31 15 views
5

Vengo da uno sfondo Hadoop e ho una conoscenza limitata di Spark. Basandomi su ciò che apprendo finora, Spark non ha nodi di mapper/reducer e invece ha nodi driver/worker. Il lavoratore è simile al mappatore e il driver è (in qualche modo) simile al riduttore. Poiché esiste un solo programma driver, ci sarà un riduttore. Se è così, come programmi semplici come il conteggio delle parole per set di dati molto grandi possono essere fatti in scintilla? Perché il driver può semplicemente esaurire la memoria.riduttore concetto in Spark

+1

@ zero323 ha un punto ... La gente smetterà di rispondere se non si accetta mai una risposta .... –

risposta

10

Il driver è più di un controllore del lavoro, che recupera solo i dati se l'operatore lo richiede. Se l'operatore su cui stai lavorando restituisce un RDD/DataFrame/Unit, i dati rimangono distribuiti. Se restituisce un tipo nativo, in effetti recupererà tutti i dati.

Altrimenti, il concetto di mappa e riduzione sono un po 'obsoleti qui (da un tipo di lavoro che si prospetta). L'unica cosa che conta davvero è se l'operazione richiede un shuffle o meno. Puoi vedere i punti di shuffle suddivisi per fase nell'interfaccia utente o tramite un toDebugString (in cui ogni livello di indentazione è un shuffle).

Tutto ciò che viene detto, per una vaga comprensione, è possibile equiparare tutto ciò che richiede un rimescolamento a un riduttore. Altrimenti è un mappatore.

scorso, di equiparare quello che hai detto contare esempio:

sc.textFile(path) 
    .flatMap(_.split(" ")) 
    .map((_, 1)) 
    .reduceByKey(_+_) 

In quanto sopra, questo sarà fatto in una fase come il caricamento dei dati (textFile), splitting (flatMap), e map ping può tutto essere fatto indipendentemente dal resto dei dati. Non è necessario alcun shuffle finché non viene chiamato reduceByKey poiché sarà necessario combinare tutti i dati per eseguire l'operazione ... TUTTAVIA, questa operazione deve essere associativa per un motivo. Ogni nodo eseguirà l'operazione definita in reduceByKey localmente, unendo solo il set di dati finale dopo. Questo riduce sia la memoria che il sovraccarico della rete.

NOTA che reduceByKey restituisce un RDD ed è quindi un transformation, quindi i dati viene mescolato mediante un HashPartitioner. Tutti i dati NON ritornano al driver, si sposta semplicemente sui nodi che hanno le stesse chiavi in ​​modo che possa avere il suo valore finale unito.

Ora, se si utilizza un action come reduce o, peggio ancora, collect, quindi non sarà possibile ottenere un RDD indietro il che significa che i dati si tira indietro al driver e avrete bisogno di spazio per essa.

Here is my fuller explanation of reduceByKey if you want more. O come questo si interrompa in qualcosa come combineByKey

+0

La proprietà assosiative introduce una funzionalità come combinatore in HAdoop. Tuttavia, per'reduceByKey 'i dati devono essere mescolati e inviati a un altro nodo di lavoro? Possiamo dire che il nodo lavoratore gioca il ruolo di riduttore? –

+0

Ciò significa che la mia prima comprensione era giusta, perché nel caso del conteggio delle parole, diciamo che abbiamo parole uniche di 1 milione. Quindi tutte quelle parole uniche (insieme alla loro frequenza parziale) vengono trasferite all'autista per essere ridotte? In altre parole, possiamo concludere che c'è un riduttore in Spark e che è l'autista? Tutte queste riduzioni sono anche fatte in Hadoop (usando il combinatore). –

+0

Blah, ho in qualche modo cancellato che reduceByKey è una trasformazione .... il driver NON otterrà tutti i dati in questo caso ... questo è il motivo per cui le funzioni di coppia vengono spinte quando si ha una rappresentazione chiave/valore ...Ho aggiornato la mia risposta per specificare che ... ma sì, i lavoratori sono i riduttori in quel ruolo. –