接上文Spark UI基础介绍,以一段sql为例介绍Jobs页面的内容:
代码语言:javascript复制select t1.dt,
t2.cooperation_type,
t1.poi_id,
t1.diff_qty
from mart_xxx.fact_sc_gms_diff_report t1
left join mart_xxx.dim_op_poi t2
on t1.grid_poi_id=t2.poi_id
where t1.dt = '20220410'
在Jobs页面可以看到上面的SQL生成了3个job, 该页面还有一个Event Timeline的链接, 点击可以看到作业的时间轴。
1.Event Timeline
点击Event Timeline后可以看到以下信息:时间线会显示Executor加入和退出的时间点, 以及job执行的起止时间.
2.job详情页面
点击job描述里的链接就可以进入对应job的详情页面, 首先看job0:job详情页面会展示这个job包含了哪些stage, 以及stage执行信息.
另外点击DAG Visualization 可以看到job的执行计划也就是DAG图:下图即job0对应的stage0及job1对应的stage1.
然后在看下触发job2的DAG图:
可以看到stage2和stage3被跳过(skipped)了。
为啥可以被跳过? 原因是spark shuffle的数据会写到磁盘固化, 当上游stage(stage2)和之前执行过的stage(stage0)相同时, 可以直接使用之前的结果, 所以stage2可以被跳过。
FAQ:
1.上游stage的Shuffle Write等于下游stage的 Shuffle Read
这个算常识, 可以在作业执行时通过上游stage的Shuffle Write量 减去 下游stage的Shuffle Read量判断执行进度. 另外还可以通过这个常识判断task是否有数据倾斜, 例如还剩1个task没执行完, 但是Shuffle Read量与上游Shuffle Write量相差很大, 那么这个正在执行的task很有可能是数据倾斜的task。
2.job提交间隔较大, 是什么情况
Spark默认的job调度模式是FIFO, 基本上前一个job执行完就会提交下一个job. 但是也有两个job间隔比较久的例子. 请注意:Spark UI只展示job信息, 如果Driver在前一个job执行完成后执行其他代码, 或者在对下一个job的提交进行预计算, 这部分耗时是不会显示在UI上的, 建议通过Driver的log判断具体原因。