Spark核心原理之Executor原理
Executor是Spark執行任務的進程,Spark啟動Executor過程包括如下步驟:
1)使用Spark-submit提交到集群,Master收到RequesSubmitDriver請求。
2)Master調用scheduler把Driver程序發送到worker端執行。
3)Driver執行時初始化SparkContext,創建AppClient,向Master注冊,其中Appclient中實現了內部類ClientEndPoint,和Master進行通信。
4)Master收到注冊信息后,完成application注冊,調用Scheduler程序,向Worker發送LaunchExecutor請求,其中Scheduler主要有兩個作用:完成Driver的調度,將waitingDriver數組中的Drivers發送的到滿足運行條件的worker上執行(launchDriver函數);在Worker節點上啟動Executor執行Application。
5)Worker啟動ExecutorRunner,在ExecutorRunner中啟動CoarseCrainedExecutorBackend,在其中創建Executor,完成向Driver注冊。
Executor中CachedThreadPool是一個線程池分配線程,任務被分發到Executor中以TaskRunner線程形式申請線程池線程,執行。接下來介紹Executor的創建,分配和啟動等關鍵操作。
Executor創建
上文已講到Executor創建主要是首先由Scheduler線程啟動,Scheduler線程通過調用startExecutorsOnWorkers方法完成,遍歷worker選擇出所有可用的workers,之后調用scheduleExecutorsOnWorkers進行worker選擇,有兩種策略:round-robin策略(默認),依次全占策略。分配好worker后調用allocateWorkerResourceToExecutor在worker上分配資源。主要調用launchExecutor,該函數向worker發送啟動Executor請求,同時向driver返回新Executor啟動信息。
下面轉到worker端,worker收到launchExecutor消息后調用LaunchExecutor函數,主要負責創建本地目錄,保存目錄和appid的映射,創建ExecutorRunner線程,該線程負責下載依賴文件,并啟動CoarseGaindExecutorBackend,此進程的啟動方式是通過建造者模式,通過CommandUtils的ProcessBuilder創建于一個獨立的JVM中,此線程向DriverActor發送registerExecutor信息,收到driverActor回復后創建Executor。
Executor通過CoarseGrainedExecutorBackend創建,所以運行于一個獨立的JVM中,可以通過配置參數調整Executor占用資源大小,創建之前會進行參數的傳遞和配置。
Executor通信接口ExecutorBackend
ExecutorBackend是Executor向集群更新消息的接口,不同spark模式有不同實現。
Executor執行過程
DAGScheduler劃分好Stage,通過submitMissingTasks分配好任務,將任務經過TaskScheduler的TaskSchedulerImpl的submitTask方法,將tasks加入調度pools,之后調用通信終端riviveOffers方法為Tasks指定Executor,最后想CoarseGranedExecutorBackend發送LaunchTasks信息。
Executor收到信息后會調用launchTasks方法,此方法會構建TaskRunner對象運行Tasks并放入線程池中執行。
TaskRunner作為一個線程類,run函數主要完成以下任務:
1)向driver發送stateUpdate信息
2)反序列出task和相關jar包
3)調用task的run方法,返回結果
總結
以上是生活随笔為你收集整理的Spark核心原理之Executor原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据中心网络架构的问题与演进 — CLO
- 下一篇: 高斯投影分带总结