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