Spark中Job 調(diào)度流程是怎么樣的?
Spark Application應(yīng)用的用戶代碼都是基于RDD的一系列計(jì)算操作,實(shí)際運(yùn)行時(shí),這些計(jì)算操作是Lazy執(zhí)行的,并不是所有的RDD操作都會(huì)觸發(fā)Spark往Cluster上提交實(shí)際作業(yè),基本上只有一些需要返回?cái)?shù)據(jù)或者向外部輸出的操作才會(huì)觸發(fā)實(shí)際計(jì)算工作(Action算子),其它的變換操作基本上只是生成對(duì)應(yīng)的RDD記錄依賴關(guān)系(Transformation算子)。
當(dāng)啟動(dòng)Spark Application的時(shí)候,運(yùn)行MAIN函數(shù),首先創(chuàng)建SparkContext對(duì)象(構(gòu)建DAGScheduler和TaskScheduler)。
第一點(diǎn)、DAGScheduler實(shí)例對(duì)象
將每個(gè)Job的DAG圖劃分為Stage,依據(jù)RDD之間依賴為寬依賴(產(chǎn)生Shuffle)
第二點(diǎn)、TaskScheduler實(shí)例對(duì)象
調(diào)度每個(gè)Stage中所有Task:TaskSet,發(fā)送到Executor上執(zhí)行

當(dāng)RDD調(diào)用Action函數(shù)(比如count、saveTextFile或foreachPartition)時(shí),觸發(fā)一個(gè)Job執(zhí)行,調(diào)度中流程如下圖所示:

Spark RDD通過其Transactions操作,形成了RDD血緣關(guān)系圖,即DAG,最后通過Action的調(diào)用,觸發(fā)Job并調(diào)度執(zhí)行。
1)、DAGScheduler負(fù)責(zé)Stage級(jí)的調(diào)度,主要是將DAG切分成若干Stages,并將每個(gè)Stage打包成TaskSet交給TaskScheduler調(diào)度。
2)、TaskScheduler負(fù)責(zé)Task級(jí)的調(diào)度,將DAGScheduler給過來的TaskSet按照指定的調(diào)度策略分發(fā)到Executor上執(zhí)行,調(diào)度過程中SchedulerBackend負(fù)責(zé)提供可用資源,其中SchedulerBackend有多種實(shí)現(xiàn),分別對(duì)接不同的資源管理系統(tǒng)。
Spark的任務(wù)調(diào)度總體來說分兩路進(jìn)行,一路是Stage級(jí)的調(diào)度,一路是Task級(jí)的調(diào)度。
一個(gè)Spark應(yīng)用程序包括Job、Stage及Task:
第一:Job是以Action方法為界,遇到一個(gè)Action方法則觸發(fā)一個(gè)Job;
第二:Stage是Job的子集,以RDD寬依賴(即Shuffle)為界,遇到Shuffle做一次劃分;
第三:Task是Stage的子集,以并行度(分區(qū)數(shù))來衡量,分區(qū)數(shù)是多少,則有多少個(gè)task。

