2015-06-07 10 views
21

Ora un giorno Spark è in corso. Spark ha usato il linguaggio scala per caricare ed eseguire il programma e anche python e java. RDD è usato per memorizzare i dati. Ma, non riesco a capire l'architettura di Spark, come funziona internamente.Internal Work of Spark

Per favore dimmi Spark Architecture e come funziona internamente?

risposta

67

Anche ho cercato nel web per conoscere la struttura interna di Spark, sotto è quello che ho potuto imparare e pensiero di condividere qui,

Spark ruota intorno al concetto di un insieme di dati distribuita resiliente (RDD), che è una raccolta tollerante agli errori di elementi che possono essere utilizzati in parallelo. Gli RDD supportano due tipi di operazioni: le trasformazioni, che creano un nuovo set di dati da uno esistente e le azioni, che restituiscono un valore al programma driver dopo aver eseguito un calcolo sul set di dati.

Spark traduce le trasformazioni RDD in qualcosa chiamato DAG (Aciclica grafo diretto) e avvia l'esecuzione,

ad alto livello, in cui ogni azione viene chiamato sul RDD, Spark crea il DAG e presenta al scheduler DAG .

  • Lo scheduler DAG divide gli operatori in fasi di attività. Una fase è composta da attività basate su partizioni dei dati di input. Lo scheduler DAG convoglia gli operatori insieme. Ad es. Molti operatori di mappe possono essere programmati in un'unica fase. Il risultato finale di un programmatore DAG è un insieme di fasi.

  • Le fasi vengono passate all'utilità di pianificazione. L'utilità di pianificazione avvia le attività tramite il gestore cluster. (Spark Standalone/Yarn/Mesos). L'utilità di pianificazione non conosce le dipendenze delle fasi.

  • Il lavoratore esegue i compiti sullo slave.

Veniamo a come Spark costruisce il DAG.

A livello alto, sono disponibili due trasformazioni sugli RDD, ovvero trasformazione stretta e ampia trasformazione. Le ampie trasformazioni determinano fondamentalmente i confini del palcoscenico.

trasformazione stretta - non richiede che i dati vengano mescolati nelle partizioni. per esempio, Map, filtro e ecc ..

vasta trasformazione - richiede i dati per essere mescolate ad esempio, reduceByKey ed ecc ..

Facciamo un esempio di contare quanti messaggi di log appaiono in ogni livello di gravità,

seguito è il file di registro che inizia con il livello di gravità,

INFO I'm Info message 
WARN I'm a Warn message 
INFO I'm another Info message 

e creare il seguente codice Scala per estrarre lo stesso,

val input = sc.textFile("log.txt") 
val splitedLines = input.map(line => line.split(" ")) 
         .map(words => (words(0), 1)) 
         .reduceByKey{(a,b) => a + b} 

Questa sequenza di comandi definisce implicitamente un DAG di oggetti RDD (linea RDD) che verrà utilizzato in seguito quando viene chiamata un'azione.Ogni RDD mantiene un puntatore a uno o più genitori insieme ai metadati sul tipo di relazione che ha con il genitore. Ad esempio, quando chiamiamo val b = a.map() su un RDD, l'RDD b mantiene un riferimento al suo genitore a, cioè un lignaggio.

Per visualizzare la discendenza di un RDD, Spark fornisce un metodo di debug toDebugString() metodo. Ad esempio l'esecuzione toDebugString() su splitedLines RDD, emette il seguente,

(2) ShuffledRDD[6] at reduceByKey at <console>:25 [] 
    +-(2) MapPartitionsRDD[5] at map at <console>:24 [] 
    | MapPartitionsRDD[4] at map at <console>:23 [] 
    | log.txt MapPartitionsRDD[1] at textFile at <console>:21 [] 
    | log.txt HadoopRDD[0] at textFile at <console>:21 [] 

La prima linea (dal basso) mostra il RDD ingresso. Abbiamo creato questo RDD chiamando sc.textFile(). Vedi sotto più vista schematica del grafico del DAG creato dal dato RDD.

RDD DAG graph

Una volta che il DAG è costruire, Spark scheduler crea un piano di esecuzione fisica. Come accennato in precedenza, lo scheduler DAG suddivide il grafico in più fasi, le fasi vengono create in base alle trasformazioni. Le strette trasformazioni saranno raggruppate (condotte a tubo) insieme in un'unica fase. Così, per il nostro esempio, Spark creerà due fasi di esecuzione come segue,

Stages

Lo scheduler DAG poi presentare le tappe nella task scheduler. Il numero di attività inviate dipende dal numero di partizioni presenti nel file di testo. L'esempio di Fox considera che abbiamo 4 partizioni in questo esempio, quindi ci saranno 4 serie di compiti creati e presentati in parallelo, a condizione che ci siano abbastanza slave/core. Sotto diagramma illustra questo po 'più in dettaglio,

Task execustion

Per informazioni più dettagliate vi suggerisco di passare attraverso i seguenti video di YouTube in cui i creatori Spark danno in Details fondo il DAG e piano di esecuzione e la durata.

  1. Advanced Apache Spark- Sameer Farooqui (Databricks)
  2. A Deeper Understanding of Spark Internals - Aaron Davidson (Databricks)
  3. Introduction to AmpLab Spark Internals
+0

Hi Santish avevo una domanda veloce. Hai affermato che ridurreByKey è una trasformazione ampia poiché "richiede che i dati vengano mischiati". Puoi per favore approfondire cosa intendi per rimescolare? Significa solo che stai aggiungendo valori da diverse tuple in modo da "mischiare" i dati in giro? – LP496

+0

Questo dovrebbe dare una descrizione grafica molto dettagliata di ciò che è mischiare - https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html – Sathish

+0

@ Simpatica spiegazione – PVH