一、構(gòu)造SparkContext
1.1. 在shell下翎卓,通過spark-submit命令將Application提交到集群,此時(shí)spark會通過反射的方式契邀,創(chuàng)建和構(gòu)造一個(gè)DriverActor進(jìn)程出來(scala中的actor類似java的多線程)
1.2. Driver進(jìn)程會執(zhí)行我們提交的Application應(yīng)用程序,一般情況下失暴,先構(gòu)造SparkConf,再構(gòu)造SparkContext
1.3. SparkContext在初始化的時(shí)候坯门,最主要的做的就是構(gòu)造DAGScheduler和TaskScheduler。
1.4. TaskScheduler實(shí)際上逗扒,是會負(fù)責(zé)古戴,通過它對應(yīng)的一個(gè)后臺進(jìn)程,去連接Spark集群的Master進(jìn)程注冊Application,
1.5. Master接收到Application的注冊請求后矩肩,會使用自己的資源調(diào)度算法(基于調(diào)度器standalone,Yarn,Mesos等都有不同的調(diào)度算法)现恼,在Spark集群的Worker上為這個(gè)Application啟動Executor
1.6. Master通知worker啟動Executor后,Worker會為Application啟動Executor進(jìn)程,
1.7. Executor啟動之后叉袍,首先做的就是會將自己反向注冊到TaskScheduler上去始锚,到此為止SparkContext完成了初始化。
二喳逛、運(yùn)行Application
2.1. 所有Executor都反向注冊到Driver上之后瞧捌,Driver結(jié)束SparkContext初始化,會繼續(xù)執(zhí)行我們編寫的代碼
2.2. 每執(zhí)行一個(gè)Action就會創(chuàng)建一個(gè)job润文,job會提交給DAGScheduler
2.3 DAGScheduler會采用自己的stage劃分算法將job劃分為多個(gè)stage姐呐,然后每個(gè)stage創(chuàng)建一個(gè)TaskSet,在此過程中典蝌,stage劃分算法非常重要皮钠,后續(xù)會進(jìn)行詳細(xì)研究。
2.4 DAGScheduler會將TaskSet傳遞給TaskScheduler赠法,TaskScheduler會把TaskSet里每一個(gè)task提交到Executor上執(zhí)行(task分配算法)
2.5 Executor每接收一個(gè)task都會用TaskRunner來封裝task麦轰,然后從線程池里面取出一個(gè)線程,執(zhí)行這個(gè)task砖织,TaskRunner將我們編寫的代碼款侵,也就是要執(zhí)行的算子以及函數(shù),拷貝侧纯,反序列化新锈,然后執(zhí)行Task。
2.6 Task有兩種眶熬,ShuffleMapTask和ResultTask妹笆。只有最后一個(gè)stage是ResultTask,之前的stage,都是ShuffleMapTask.
2.7 所以娜氏,最后整個(gè)Spark應(yīng)用程序的執(zhí)行拳缠,就是將stage分批次作為taskset提交給executor執(zhí)行,每個(gè)task針對RDD的一個(gè)parktition贸弥,執(zhí)行我們定義的算子和函數(shù)窟坐,以此類推,直到所有操作執(zhí)行完為止绵疲。