背景
我們在查看spark ui的界面時,一段spark sql的執行經常看到會有對應有幾個job,然后每個job又有幾個stage,而每個stage又有好多個task,那么這些job,stage,task是怎么和spark 算子對應的呢
算子和job數,stage數以及task數的對應關系
1.Action算子,包含collect算子,saveAsTextFile算子,count算子,top算子,foreach算子等等,spark每遇到一個這種算子都會創建一個job
2.shuffle算子,包含group by,join,distinct等算子,每個job劃分多個stage時,就是按照shuffle算子的來進行劃分stage的
3.task算子,包括filter,map等算子,這些算子對應到每個task任務中并行執行
比如如下代碼:
x = sc.parallelize([(“m”, 1), (“n”, 1)],2)
y = sc.parallelize([(“m”, 1), (“n”, 1), (“o”, 1)], 3)
rdd = x.join(y)
rdd.collect()
rdd.distinct().collect()
這里總共有兩個行動算子collect,所有有兩個job
job1:rdd.collect這個job有兩個stage,第一個stage由shuffle的join操作:x.join(y)生成,共包含5個task(x有兩個分區+y有3個分區),
后面一個stage是collect,有五個task
job2:rdd.distinct().collect() 這個job也是有兩個stage,第一個stage有distict算子生成,共有5個task(和rdd的分區數一樣),第二個stage由collect生成,也是5個task
所以spark ui界面上總共有2個job,4個stage,20個task
參考文獻https://blog.csdn.net/guolindonggld/article/details/119974971