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