1. 程式人生 > >Spark的基本概念及工作原理

Spark的基本概念及工作原理

/*
 * Cluster-> WordNode -> Executors -> Threads -> Task
 *
 * Job Action操作 * Stage shuffle操作 *
 * Application -> Jobs -> Stages -> Task
 */

Spark作業的基本概念

-Application:使用者自定義的Spark程式,使用者提交後,Spark為App分配資源將程式轉換並執行。

-Driver Program:執行Application的main()函式並且建立SparkContext。

-RDD DAG:當RDD遇到Action運算元,將之前的所有運算元形成一個有向無環圖(DAG)。再在Spark中轉化為Job,提交到叢集進行執行。一個App中可以包含多Job。

-Job:一個RDD Graph觸發的作業,往往由Spark Action運算元觸發,在SparkContext中通過runJob方法向Spark提交Job。

-Stage:每個Job會根據RDD的寬依賴關係被切分很多Stage,每個Stage中包含一組相同的Task,這一組Task也叫TaskSet。

-Task:一個分割槽對應一個Task,Task執行RDD中對應Stage中所包含的運算元。Task被封裝好後放入Executor的執行緒池中執行。Executor會線上程池中取得一個執行緒,分配給一個任務,之後任務執行完成,執行緒池回收執行緒。


Spark程式與作用概念對映

val rawFile = sc.textFile("README.md") //Application:1-6行

(將輸入的文字檔案轉化為RDD)

val words = rawFile.flatMap(line=>line.split(" ")) //Job:1-5行

(將文字檔案對映為word單詞,將文字檔案進行分詞,轉換為一個單詞的RDD)

val wordNumber = words.map(w=>(w,1)) //Stage:1-3或4-5行

(將RDD中的每個單詞對映為,單詞名稱為key,value為1的kye-value對)

val wordCounts = wordNumber.reduceByKey(_+_) //Tasks:1-3或4-5行

(通過reduceBykey操作,將同一個單詞的資料進行聚集,進而統計好每一個單詞的個數)

wordCounts.foreach(println)

(foreach輸出每一個單詞的計數)

wordCounts.saveAsTextFile

saveAsTextFile將結果儲存到磁碟

6行程式碼對應為一個Application,這個應用程式中有兩個Job,1-5行是一個Job,1-4 + 6行是一個Job。

在1-5行這個Job中:
1-3行是一個stage,4-5行是一個stage,因為map和reduceByKey之間要進行shuffle操作。


Spark作業執行流程

-Spark程式轉換,將應用程式提交到叢集,叢集將程式由一個application轉換成不同的任務集;

-在叢集中輸入資料塊

-叢集會根據排程策略執行各個Stage的Tasks分發到各個節點,在每個資料塊上進行執行

-執行完成後,會根據shuffle在叢集中將結果進行混洗,再進行下一階段的Stage,直到所有Stage執行完畢,輸出結果返回

Driver

sc

DAGScheduler -> Stage -> Task

TaskScheduler -> 分發Task到Worker

Driver -> 收集Worker的計算結果

Work

執行Task