1.通過spark-submit指令碼提交spark程式
在spark-submit指令碼里面執行了SparkSubmit類的main方法
2.執行SparkSubmit類的main方法
3.呼叫doSubmit方法
4.呼叫submit方法
在submit方法裡呼叫doRunMain方法,最終呼叫runMain方法
5.在runMain方法裡面獲取mainClass,再去執行start方法
在這裡根據提交模式來選擇mainClass
6.在start方法裡面去呼叫YarnClusterApplication的start方法
7.YarnClusterApplication方法裡面new一個yarnClient物件,並執行run方法
8.run方法裡執行submitApplication提交application
9.submitApplication方法裡首先會去請求RM並返回一個appId,然後建立container和application上下文環境並執行submitApplication提交application
這裡通過createContainerLaunchContext方法啟動了ApplicationMaster
10.呼叫ApplicationMaster類的main方法
在這裡首先new一個ApplicationMaster,然後呼叫了master的run方法
11.呼叫ApplicationMaster的run方法
這裡會根據是否是叢集模式執行不同的方法
12.呼叫runDriver方法
12.1呼叫startUserApplication方法啟動一個driver執行緒
12.2將AM註冊到RM
12.3分配資源
這裡通過呼叫runAllocatedContainers方法在分配的container裡面執行executors
12.4呼叫ExecutorRunnable的run方法,然後呼叫run方法裡面的startContainer方法來啟動executor
12.5呼叫prepareCommand方法來執行org.apache.spark.executor.YarnCoarseGrainedExecutorBackend類
13.執行YarnCoarseGrainedExecutorBackend類main方法的run方法建立executor終端
14.呼叫setupEndpoint建立executor終端
15.反向註冊executor到driver
16.driver端接收
在SparkContext中有SchedulerBackend,它是一個特質,具體實現類為CoarseGrainedSchedulerBackend,該類中有一個receiveAndReply方法來對executor的註冊做回覆