1. 程式人生 > >Spark原始碼解讀--任務生成和提交過程

Spark原始碼解讀--任務生成和提交過程

Application
把APP打包上傳到叢集:
$SPARK_HOME/spark-submit \
–class com.sparktest \
–master spark://minimaster:7077 \
/home/wc.jar

Driver端:
1.呼叫SparkSubmit類,內部執行submit → doRunMain → 通過反射獲取應用程式的主類物件 → 執行主類的main方法

SparkContext
2.構建SparkConf和SparkContext物件,在SparkContext入口類做了三件事,建立了SparkEnv物件(建立了SparkEnv物件[建立了ActorSystem物件]TaskScheduler[用來生成併發送task給Executor],DAGScheduler[用來劃分Stage])

3.ClientActor將任務資訊封裝到ApplicationDescription物件裡並且提交給Master

Master端:
4.Master收到ClientActor提交的任務資訊後,把任務資訊存到記憶體中,然後又將任務資訊放到佇列中(waitingApps)
5.當開始執行這個任務資訊時,呼叫scheduler方法,進行資源排程
6.將排程好的資源封裝到LaunchExecutor併發送給對應的Worker

Worker端:
7.Worker接收到Master傳送過來的排程資訊(LaunchExecutor)後,將資訊封裝成一個ExecutorRunner物件
8.封裝成ExecutorRunner後,呼叫ExecutorRunner的start方法,開始啟動CoarseGrainedExecutorBackend物件

TaskScheduler
ClientActor:負責和Master通訊,向Master註冊任務資訊
DriverActor:負責和Executor通訊,接收Executor反向註冊和把任務傳送到Executor

9.Executor啟動後向DriverActor進行反向註冊
Executor:
10.與DriverActor註冊成功後,建立一個執行緒池(ThreadPool),用來執行任務

17.Executor接收到DriverActor傳送過來的任務(LaunchExecutor),會將其封裝成TaskRunner,然後從執行緒池中獲取執行緒來執行TaskRunner
18.TaskRunner拿到反序列化TaskSet.然後執行APP程式碼,也就是對RDD分割槽上執行的運算元和自定義函式

11.當所有的Executor註冊完成後,意味著作業環境準備好了,Driver端會結束語SparkContext物件的初始化

DAGScheduler
12.當Driver初始化完成後(建立一個sc例項),會繼續執行我們自己提交的APP的程式碼,當觸發了Action的RDD運算元時,就觸發了一個job,這時就會呼叫DAGScheduler物件進行stage劃分
13.DAGScheduler開始進行Stage劃分

14.將劃分好的Stage按照分割槽生成一個一個的task,並且封裝到TaskSet物件,然後TaskSet提交到TaskScheduler
15.TaskScheduler接收到提交過來的Taskset,拿到一個序列化器,對TaskSet序列化,將序列化好的TaskSet封裝到LaunchExecutor並提交到DriverActor

16.把LaunchExecutor傳送到Executor上

這裡寫圖片描述