1. 程式人生 > >Spark on YARN client模式作業執行全過程分析

Spark on YARN client模式作業執行全過程分析

      在前篇文章中我介紹了Spark on YARN叢集模式(yarn-cluster)作業從提交到執行整個過程的情況(詳情見《Spark on YARN叢集模式作業執行全過程分析》),我們知道Spark on yarn有兩種模式:yarn-cluster和yarn-client。這兩種模式作業雖然都是在yarn上面執行,但是其中的執行方式很不一樣,今天我就來談談Spark on YARN yarn-client模式作業從提交到執行的過程剖析。
  和yarn-cluster模式一樣,整個程式也是通過spark-submit指令碼提交的。但是yarn-client作業程式的執行不需要通過Client類來封裝啟動,而是直接通過反射機制呼叫作業的main函式。下面就來分析:
  1、通過SparkSubmit類的launch的函式直接呼叫作業的main函式(通過反射機制實現),如果是叢集模式就會呼叫Client的main函式。
  2、而應用程式的main函式一定都有個SparkContent,並對其進行初始化;
  3、在SparkContent初始化中將會依次做如下的事情:設定相關的配置、註冊MapOutputTracker、BlockManagerMaster、BlockManager,建立taskScheduler和dagScheduler;其中比較重要的是建立taskScheduler和dagScheduler。在建立taskScheduler的時候會根據我們傳進來的master來選擇Scheduler和SchedulerBackend。由於我們選擇的是yarn-client模式,程式會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend,並將YarnClientSchedulerBackend的例項初始化YarnClientClusterScheduler,上面兩個例項的獲取都是通過反射機制實現的,YarnClientSchedulerBackend類是CoarseGrainedSchedulerBackend類的子類,YarnClientClusterScheduler是TaskSchedulerImpl的子類,僅僅重寫了TaskSchedulerImpl中的getRackForHost方法。
  4、初始化完taskScheduler後,將建立dagScheduler,然後通過taskScheduler.start()啟動taskScheduler,而在taskScheduler啟動的過程中也會呼叫SchedulerBackend的start方法。在SchedulerBackend啟動的過程中將會初始化一些引數,封裝在ClientArguments中,並將封裝好的ClientArguments傳進Client類中,並client.runApp()方法獲取Application ID。
  5、client.runApp裡面的做是和前面客戶端進行操作
那節類似,不同的是在裡面啟動是ExecutorLauncher(yarn-cluster模式啟動的是ApplicationMaster)。
  6、在ExecutorLauncher裡面會初始化並啟動amClient,然後向ApplicationMaster註冊該Application。註冊完之後將會等待driver的啟動,當driver啟動完之後,會建立一個MonitorActor物件用於和CoarseGrainedSchedulerBackend進行通訊(只有事件AddWebUIFilter他們之間才通訊,Task的執行狀況不是通過它和CoarseGrainedSchedulerBackend通訊的)。然後就是設定addAmIpFilter,當作業完成的時候,ExecutorLauncher將通過amClient設定Application的狀態為FinalApplicationStatus.SUCCEEDED。
  7、分配Executors,這裡面的分配邏輯和yarn-cluster裡面類似,就不再說了。
  8、最後,Task將在CoarseGrainedExecutorBackend裡面執行,然後執行狀況會通過Akka通知CoarseGrainedScheduler,直到作業執行完成。
  9、在作業執行的時候,YarnClientSchedulerBackend會每隔1秒通過client獲取到作業的執行狀況,並打印出相應的執行資訊,當Application的狀態是FINISHED、FAILED和KILLED中的一種,那麼程式將退出等待。