如何在Spark UI中查看Spark Stage执行内容及排查作业慢的原因?
查看Spark Stage执行内容及确认特定操作的方法
一、查看Stage正在执行的内容
- 打开Spark UI的Jobs页面,找到目标作业后点击对应的Stage ID进入Stage详情页
- Tasks标签:查看每个Task的执行明细,包括输入数据量、Shuffle读写量、各阶段耗时分布,能直接定位哪部分拖慢了速度
- Event Timeline标签:你已经注意到Executor Computing Time占比高,这里可以展开每个Executor的时间线,明确是Shuffle Read、Sort还是纯计算环节耗时
- DAG Visualization:这里的节点对应DataFrame/RDD的操作,你看到的ShuffleQueryStage对应Shuffle后的Stage,Sort是连接操作里的排序步骤,WholeStageCodegen是Spark的代码生成优化,把多个算子合并成一段代码执行
二、确认是否执行Coalesce或WriteFiles操作
方法1:Stage详情页的描述与任务指标
- 进入Stage详情页后,顶部的Description会显示该Stage的核心操作,比如Coalesce会直接标注
Coalesce,WriteFiles则会显示SaveAsParquet/WriteToDataSourceV2这类写操作描述 - 查看Tasks标签的Task Metrics:如果是Coalesce阶段,Task数量会明显少于上游Stage(因为合并了分区);如果是WriteFiles阶段,会有Output Size指标,且任务类型为
ResultTask(写操作属于Result Stage)
方法2:作业完整DAG视图
- 回到Jobs页面,点击作业对应的DAG Visualization(不是单个Stage的),完整DAG会展示所有操作节点,Coalesce是单独的
Coalesce节点,WriteFiles对应Save/Write类节点,一眼就能识别
方法3:搜索Event Log
- 在Spark UI的Events页面,直接搜索
coalesce或write关键词,能找到对应的操作触发日志,确认是否执行了这些步骤
三、结合你的场景的优化提示
- 你用到的左连接确实会触发ShuffleQueryStage和Sort,因为Spark连接需要按关联键做Shuffle、排序,数据量大时这两步本身就耗时
- Executor Computing Time高的话,先看每个Task的Input Size:如果单Task处理数据量过大,可调整
spark.sql.shuffle.partitions参数(默认200)匹配集群资源;如果是Sort耗时,检查是否能减少不必要的排序(比如调整连接策略为广播连接,小表广播后可避免Shuffle) - 若确认有Coalesce,检查合并后的分区数是否太少导致单Task负载过高;若有WriteFiles,排查存储系统的写入瓶颈,或者调整写操作的分区数
内容的提问来源于stack exchange,提问作者simplycoding
相关产品推荐
相关产品推荐

