標籤:打通spark系統運行內幕機制迴圈流程
內容:
1、TaskScheduler工作原理;
2、TaskScheduler源碼解密;
Stage裡面有一系列任務,裡面的任務是並行計算的,邏輯是完全相同的,只不過是處理的資料不同而已。
DAGScheduler會以Task方式提交給TaskScheduler(任務調度器)。
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
==========TaskScheduler工作原理解密============
1、DAGScheduler在提交TaskSet給底層調度器的時候是面向介面TaskScheduler,這符合物件導向中依賴抽象,而不依賴具體的原則,帶來了底層資源調度器的可插拔性,導致Spark可以運行在眾多的資源調度器模式上,例如Standalone、YARN、Mesos、Local、EC2以及其它自訂的資源調度器,在Standalone的模式下,我們聚焦於TaskSchedulerImpl;
2、在SparkContext執行個體化的時候,通過createTaskScheduler來建立TaskSchedulerImpl和SparkDeploySchedulerBackend
case SPARK_REGEX(sparkUrl) =>
val scheduler = new TaskSchedulerImpl(sc)
val masterUrls = sparkUrl.split(",").map("spark://" + _)
val backend = new SparkDeploySchedulerBackend(scheduler, sc, masterUrls)
scheduler.initialize(backend)
(backend, scheduler)
在TaskSchedulerImpl的initialize方法中把SparkDeploySchedulerBackend傳進來從而賦值為TaskSchedulerImpl的,在TaskSchedulerImpl 調用start方法的時候會調用backend.start方法,在start方法中會最終註冊應用程式;
3、TaskScheduler的核心任務是提交TaskSet到叢集運算並彙報結果:
1)為TaskSet建立和維護一個TaskSetManager並追蹤任務的本地性以及錯誤資訊;
2)遇到Straggle任務的時候會放到其它的節點進行重試;
3)TaskScheduler必須向DAGScheduler彙報執行情況,包括在shuffle輸出lost的時候報告fetch fail等資訊;
4、TaskScheduler內部會握有SchedulerBackend,從Standalone的模式來講,具體實現是SparkDeploySchedulerBackend;
5、SparkDeploySchedulerBackend 在啟動的時候構造AppClient執行個體,並在該執行個體start的時候啟動了ClientEndpoint這個訊息迴圈體,ClientEndpoint 在啟動的時候會向Master註冊當前程式,而SparkDeploySchedulerBackend 的父類CoarseGrainedSchedulerBackend在start的時候會執行個體化類型為DriverEndpoint(這就是我們程式運行時候經典對象的Driver)的訊息迴圈體,SparkDeploySchedulerBackend專門負責收集Worker上的資源資訊,當ExecutorBackend啟動的時候會發送RegisterExecutor資訊向DriverEndpoint註冊,此時SparkDeploySchedulerBackend就掌握了當前應用程式擁有的計算資源,TaskScheduler就是通過SparkDeploySchedulerBackend 擁有的計算資源來具體運行Task;
6、SparkContext、DAGScheduler、TaskSchedulerImpl、SparkDeploySchedulerBackend在應用程式啟動的時候,只執行個體化一次,應用程式存在期間,始終存在這些對象;
大總結:在SparkContext執行個體化的時候調用createTaskScheduler來建立TaskSchedulerImpl和SparkDeployShedulerBackend,同時在Spark執行個體化的時候,會調用TaskSchedulerImpl的start,start方法中會調用SparkDeployShedulerBackend的start,在該方法中會建立AppClient對象,並調用AppClient對象的start方法,在該方法中會建立ClientEndpoint,在建立ClientEndpoint會傳入Command來指定具體為當前應用程式啟動的executor進程的入口類的名稱為CoarseGrainedExecutorBackend,然後ClientEndpoint啟動並通過tryRegisterMaster來註冊當前的應用程式到Master中,Master接收到註冊資訊後,如果可以運行程式則會為該程式產生JobID,並通過schedule()來分配計算資源,具體計算資源的分配是通過應用程式的運行方式、memory、cores等配置資訊來決定,最後Master會發送指令給Worker,Worker為當前應用程式分配計算資源時會首先分配ExecutorRunner,ExecutorRunner內部會通過Thread的方式構建ProcessBuiler來啟動另外一個JVM進程,這個JVM進程啟動時候載入的main方法所在的類的名稱就是在建立ClientEndpoint會傳入的Command來指定具體名稱為CoarseGrainedExecutorBackend的類,此時,JVM看到在通過ProcessBuilder啟動的時候獲得了CoarseGrainedExecutorBackend載入並調用裡面的main方法,在main方法中會執行個體化CoarseGrainedExecutorBackend本身這個訊息迴圈體,而CoarseGrainedExecutorBackend在執行個體化的時候會通過回調onStart向DriverEndpoint發送registerExecutor來註冊當前的CoarseGrainedExecutorBackend ,此時DriverEndpoint收到該註冊資訊並儲存在了SparkDeploySchedulerBackend執行個體的記憶體資料結構中,這樣Driver就獲得了計算資源。
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />
作業:
把大總結畫流程圖。
王家林老師名片:
中國Spark第一人
新浪微博:http://weibo.com/ilovepains
公眾號:DT_Spark
部落格:http://blog.sina.com.cn/ilovepains
手機:18610086859
QQ:1740415547
郵箱:[email protected]
本文出自 “一枝花傲寒” 部落格,謝絕轉載!
打通Spark系統運行內幕機制迴圈流程(DT大資料夢工廠)