1.首先用spark-submit提交我們的application,那么在standalone模式下医窿,會在client啟動一個Driver進程,這個driver就是執(zhí)行我們的application應用程序,也就是我們編寫的代碼。
2.driver做的第一件事情就去構造 sparkContext秉颗,構造sparkContext 就會初始化我們的DAGScheduler和TaskScheduler.
3.構造完TaskScheduler后痢毒,會到Master去注冊我們的application.
4.master會根據(jù)自己的資源調度算法去worker上啟動executor,executor啟動完后會到taskScheduler反向注冊.
5.反向注冊之后送矩,就會執(zhí)行我們編寫的代碼,每次執(zhí)行到action操作時哪替,就會創(chuàng)建一個job.
6.這個job就會給DAGScheduler,DAGScheduler就會根據(jù)自己的stage劃分算法栋荸,把job劃分成多個stage.
7.每個stage就會創(chuàng)建一個taskSet,taskSet會提交給TaskScheduler,TaskScheduler就會把taskset分配到剛才反向注冊過來的executor上取執(zhí)行。
8.executor接受到task后晌块,會用TaskRunner來封裝task爱沟,然后從線程池中取出一個task來執(zhí)行。執(zhí)行就是要執(zhí)行算子以及函數(shù)匆背,拷貝呼伸,反序列化,然后執(zhí)行task.
9.task分為兩種钝尸,ShuffleMapTask和ResultTask括享,只有最后一個stage是ResultTask,之前的stage珍促,都是ShuffleMapTask.
10.所以整個spark應用程序的執(zhí)行铃辖,就是stage分批次作為taskset提交到executor執(zhí)行,每個task針對Rdd的一個partition,執(zhí)行我們定義的算子函數(shù)猪叙。以此類推娇斩,直到執(zhí)行所有的操作。