Spark一些基礎原理——Job
背景知識:Spark基本工作原理、RDD
lv0
一個典型的Job是由以下過程組成:從資料來源(Data blocks)載入生成RDD(每個資料分片Partition一般是128M,最後一條記錄橫跨2個blocks),後將RDD經過一系列轉換(包括基本型別轉換和洗牌)最終得到計算結果(result),再將結果彙總到driver端。往往由Action觸發,每個Action對應一個Job。(後接1-1)
每個Job由一個或多個Stage構成,Stage根據寬依賴進行劃分。各Stage之間是有前後關係的,只有前面的Stage完成計算才會執行下一個Stage。
每個Stage是由一組或多組Task組成的,是平行計算的實體,在Executor中執行。Task分為兩類,一類為shuffleMapTask作為中間過程,另一類為resultTask作為最後的Task。其生命週期如下:①Driver中的CoarseGrainedSchedulerBackend(粗粒度後端排程)(序列化任務大小限制為128M)給CoarseGrainedExecutorBackend(粗粒度後端執行)傳送的LaunchTask(Task啟動指令)後,反序列化TaskDescription(Task任務描述)(第一次反序列化,共4次)。②Executor通過LaunchTask執行Task,通過new()函式建立TaskRunner。③TaskRunner通過ThreadPool執行具體的Task,通過run方法呼叫statusUpdate向Driver彙報狀態為Running。④TaskRunner內部反序列化Task相關依賴(第二次反序列化,共4次),獲取所需要的檔案和jar。⑤反序列化Task本身(第三次反序列化,共4次)。⑥執行任務,Task通過runTask方法呼叫RDD的iteratior方法對Partition進行計算,其中對ShuffleMapTask中的元素先對RDD及其依賴關係進行反序列化(第四次反序列化,共4次),最終呼叫RDD的compute方法進行計算;而對ResultTask則根據rdd.iteratior最終呼叫compute執行。⑦執行結果序列化傳給Driver。⑧CoarseGrainedExecutorBackend向DriverEndpoint傳送StatusUpdate傳輸執行結果(該結果最大為1GB),DriverEndpoint會將結果傳輸給TaskSchedulerImpl處理,最終交給TaskResultGetter通過執行緒分別處理成功與失敗兩種情況,最終告訴DAGScheduler任務處理結束情況。
lv1-1
每個Action運算元本質上是執行了sc的runJob方法,這是一個過載方法。核心是交給DAGScheduler中的submitJob執行,通過JobSubmitted物件給eventProcessLoop。eventProcessLoop實現了EventLoop中的onReceive方法,該方法回撥doOnReceive經過模式匹配方式執行到JobSubmitted,在handleJobSubmitted中建立finalStage,建立與父Stage的依賴鏈條。