spark提交過程分析(standalone模式)

一、構(gòu)造SparkContext

Paste_Image.png

1.1. 在shell下,通過spark-submit命令將Application提交到集群,此時spark會通過反射的方式,創(chuàng)建和構(gòu)造一個DriverActor進程出來(scala中的actor類似java的多線程)
1.2. Driver進程會執(zhí)行我們提交的Application應(yīng)用程序,一般情況下,先構(gòu)造SparkConf,再構(gòu)造SparkContext
1.3. SparkContext在初始化的時候,最主要的做的就是構(gòu)造DAGScheduler和TaskScheduler。
1.4. TaskScheduler實際上,是會負(fù)責(zé),通過它對應(yīng)的一個后臺進程,去連接Spark集群的Master進程注冊Application,
1.5. Master接收到Application的注冊請求后,會使用自己的資源調(diào)度算法(基于調(diào)度器standalone,Yarn,Mesos等都有不同的調(diào)度算法),在Spark集群的Worker上為這個Application啟動Executor
1.6. Master通知worker啟動Executor后,Worker會為Application啟動Executor進程,
1.7. Executor啟動之后,首先做的就是會將自己反向注冊到TaskScheduler上去,到此為止SparkContext完成了初始化。

二、運行Application

Paste_Image.png

2.1. 所有Executor都反向注冊到Driver上之后,Driver結(jié)束SparkContext初始化,會繼續(xù)執(zhí)行我們編寫的代碼
2.2. 每執(zhí)行一個Action就會創(chuàng)建一個job,job會提交給DAGScheduler
2.3 DAGScheduler會采用自己的stage劃分算法將job劃分為多個stage,然后每個stage創(chuàng)建一個TaskSet,在此過程中,stage劃分算法非常重要,后續(xù)會進行詳細(xì)研究。
2.4 DAGScheduler會將TaskSet傳遞給TaskScheduler,TaskScheduler會把TaskSet里每一個task提交到Executor上執(zhí)行(task分配算法)
2.5 Executor每接收一個task都會用TaskRunner來封裝task,然后從線程池里面取出一個線程,執(zhí)行這個task,TaskRunner將我們編寫的代碼,也就是要執(zhí)行的算子以及函數(shù),拷貝,反序列化,然后執(zhí)行Task。
2.6 Task有兩種,ShuffleMapTask和ResultTask。只有最后一個stage是ResultTask,之前的stage,都是ShuffleMapTask.
2.7 所以,最后整個Spark應(yīng)用程序的執(zhí)行,就是將stage分批次作為taskset提交給executor執(zhí)行,每個task針對RDD的一個parktition,執(zhí)行我們定義的算子和函數(shù),以此類推,直到所有操作執(zhí)行完為止。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容