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