Spark-Job-Stage-Task之間的關(guān)系
基本概念
在開(kāi)始之前需要先了解Spark中Application,Job,Stage等基本概念,官方給出的解釋如下表:
| Term | Meaning |
|---|---|
| Application | 用戶(hù)編寫(xiě)的Spark應(yīng)用程序,包括一個(gè)Driver和多個(gè)executors |
| Application jar | 包含用戶(hù)程序的Jar包 |
| Driver Program | 運(yùn)行main()函數(shù)并創(chuàng)建SparkContext進(jìn)程 |
| Cluster manager | 在集群上獲取資源的外部服務(wù),如standalone manager,yarn,Mesos |
| deploy mode | 部署模式,區(qū)別在于driver process運(yùn)行的位置 |
| worker node | 集群中可以運(yùn)行程序代碼的節(jié)點(diǎn)(機(jī)器) |
| Executor | 運(yùn)行在worker node上執(zhí)行具體的計(jì)算任務(wù),存儲(chǔ)數(shù)據(jù)的進(jìn)程 |
| Task | 被分配到一個(gè)Executor上的計(jì)算單元 |
| Job | 由多個(gè)任務(wù)組成的并行計(jì)算階段,因RDD的Action產(chǎn)生 |
| Stage | 每個(gè)Job被分為小的計(jì)算任務(wù)組,每組稱(chēng)為一個(gè)stage |
| DAGScheduler | 根據(jù)Job構(gòu)建基于Stage的DAG,并提交Stage給TaskScheduler |
| TaskScheduler | 將TaskSet提交給worker運(yùn)行,每個(gè)executor運(yùn)行什么task在此分配 |
Job-Stage-Task之間的關(guān)系
如下圖所示,一個(gè)Spark程序可以被劃分為一個(gè)或多個(gè)Job,劃分的依據(jù)是RDD的Action算子,每遇到一個(gè)RDD的Action操作就生成一個(gè)新的Job。
每個(gè)spark Job在具體執(zhí)行過(guò)程中因?yàn)閟huffle的存在,需要將其劃分為一個(gè)或多個(gè)可以并行計(jì)算的stage,劃分的依據(jù)是RDD間的Dependency關(guān)系,當(dāng)遇到Wide Dependency時(shí)因需要進(jìn)行shuffle操作,這涉及到了不同Partition之間進(jìn)行數(shù)據(jù)合并,故以此為界劃分不同的Stage。
Stage是由Task組組成的并行計(jì)算,因此每個(gè)stage中可能存在多個(gè)Task,這些Task執(zhí)行相同的程序邏輯,只是它們操作的數(shù)據(jù)不同。一般RDD的一個(gè)Partition對(duì)應(yīng)一個(gè)Task,Task可以分為ResultTask和ShuffleMapTask。

RDD-Partition-Records-Task之間的關(guān)系
通常一個(gè)RDD被劃分為一個(gè)或多個(gè)Partition,Partition是Spark進(jìn)行數(shù)據(jù)處理的基本單位,一般來(lái)說(shuō)一個(gè)Partition對(duì)應(yīng)一個(gè)Task,而一個(gè)Partition中通常包含數(shù)據(jù)集中的多條記錄(Record)。
注意不同Partition中包含的記錄數(shù)可能不同。Partition的數(shù)目可以在創(chuàng)建RDD時(shí)指定,也可以通過(guò)reparation和coalesce等算子重新進(jìn)行劃分。
通常在進(jìn)行shuffle的時(shí)候也會(huì)重新進(jìn)行分區(qū),這是對(duì)于key-valueRDD,Spark通常根據(jù)RDD中的Partitioner來(lái)進(jìn)行分區(qū),目前Spark中實(shí)現(xiàn)的Partitioner有兩種:HashPartitioner和RangePartitioner,當(dāng)然也可以實(shí)現(xiàn)自定義的Partitioner,只需要繼承抽象類(lèi)Partitioner并實(shí)現(xiàn)numPartitions and getPartition(key: Any)即可。

將上面的概念串聯(lián)起來(lái),可以得到下面的運(yùn)行層次圖:

Reference: