Spark Structured Streaming UI中WholeStageCodegen时长是如何计算的?
Spark UI WholeStageCodegen 时长显示问题解答
1. WholeStageCodegen节点的显示时长是否为实际测量值?
是实际测量值,但统计口径不是节点自身的独立执行时长。
同一Stage内的多个WholeStageCodegen节点会被整合到同一个Task的执行流水线中,UI上每个WholeStageCodegen节点显示的时长,实际是该节点所属Task的总运行时长,所有同Stage内的WholeStageCodegen节点共享同一个Task的运行时长统计,所以才会出现多个节点时长接近、累加后远大于Stage总时长的现象。你观测到的Stage总时长比单节点显示时长高0.1-0.3s,属于Stage调度、shuffle前置/收尾操作的额外开销,符合正常情况。
因此该数值不是未落地功能的占位值,只是统计口径和常规理解不一致导致的误解。
2. 如何获取各WholeStageCodegen的单独耗时?
你可以通过开启细粒度指标获取各节点的独立执行耗时:
- 首先确认配置项
spark.sql.codegen.metrics.enabled设为true(Spark 3.2及以上版本默认开启),开启后Spark会为每个WholeStageCodegen节点统计独立的运行指标。 - 配置生效后,在Spark UI的SQL查询详情页,点击对应WholeStageCodegen节点,展开下拉的Metrics面板,即可看到该节点专属的
runTime(实际运行时长)、cpuTime(CPU占用时长)等指标,该数值不会和其他节点重复,是节点真正的独立耗时。 - 如果需要离线批量分析,可以提前开启Spark事件日志(配置
spark.eventLog.enabled=true),后续解析事件日志中的SQLPlanMetrics记录,即可批量提取所有WholeStageCodegen节点的独立耗时数据。
3. 现有UI显示数值的作用是什么?
现有UI上直接显示的WholeStageCodegen节点时长,核心作用是快速标识该节点所属Task的整体运行水位,帮你快速定位慢Task所在的算子链路,不需要对多个节点的数值做累加计算。
内容的提问来源于stack exchange,提问作者Dyin
相关产品推荐
相关产品推荐

