我们在查看spark ui的界面时,一段spark sql的执行经常看到会有对应有几个job,然后每个job又有几个stage,而每个stage又有好多个task,那么这些job,stage,task是怎么和spark 算子对应的呢
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