在实际业务开发过程中,企业通常要求作业能在期望的时间节点前产出结果,并根据结果做进一步决策,这就需要作业开发人员及时关注作业运行状态,识别并优化慢作业。您可以通过MaxCompute的Logview功能诊断慢作业。本文为您介绍导致出现慢作业的原因及如何查看慢作业并提供对应的解决措施。
背景信息
MaxCompute提供的Logview功能会记录作业的全部运行阶段日志信息,为查看和调式作业提供指导依据。您可以通过作业运行结果中的Log View处获取Logview链接。MaxCompute提供了2个版本的Logview功能,推荐您使用Logview 2.0,页面加载速度、设计风格更优。更多Logview 2.0信息,请参见Logview 2.0。
计算资源不足
问题现象- 现象一:作业一直显示
Job Queueing...
状态。可能因其他作业占用了资源组的资源,出现作业排队情况。您可以通过如下步骤查看作业等待时长:
- 在作业运行结果信息中获取Logview链接并在浏览器中打开。
- 在SubStatusHistory页签的Description列查看Waiting for scheduling对应的Latency值,即为等待时长。
- 在作业运行结果信息中获取Logview链接并在浏览器中打开。
- 现象二:作业有进展但执行速度慢。
提交作业后,由于所需计算资源较多,当前的资源组不能同时启动所有的Fuxi Instance,作业虽然有进度但执行不快。您可以通过如下步骤查看作业执行状态:
- 在作业运行结果信息中获取Logview链接并在浏览器中打开。
- 在Job Details页签的Fuxi Instance区域,单击Latency Chart,查看作业运行状态图。
下图展示的是一个资源充足的作业的运行状态,蓝色部分的低端是平齐的,表明所有的Fuxi Instance几乎在同一时间启动。
下图展示的是一个资源不充足的作业的运行状态,图形整体呈现阶梯向上的形态,表明作业的Fuxi Instance是逐步调度起来的。
- 进入MaxCompute管家。
- 在左侧导航栏,单击配额。
- 在包年包月配额组区域,单击MaxCompute项目对应的配额组。
- 在资源消耗页签的预留CU资源使用趋势图中,单击计算资源使用量最高的点,记录时间点。
- 在左侧导航栏,单击作业后,在右侧单击作业管理。
- 在作业管理页面,根据记录的时间点填写日期范围,在作业状态下拉列表选择Running,单击确定。
- 在作业列表区域,单击CPU使用占比(%)后的
图标,将作业按照CPU使用量占比降序排列。
- 如果某个作业占用CPU特别大,单击作业操作列的Logview,在Fuxi Instance区域查看I/O Bytes。当I/O Bytes只有1 MB或几十KB,且作业的并行度很高(多个Fuxi Instance)时,表明读取表的小文件过多,需要合并小文件或调整并行度。
- 如果CPU占比均匀说明同时提交了多个大作业,占满了计算资源。您需要增购计算资源或将作业使用按量计费资源运行。
- 合并小文件:
- 调整并行度:
MaxCompute的并行度会根据输入的数据量和作业复杂度自动推测执行,一般不需要调节,理想情况并行度越大速度处理越快。但是对于包年包月资源组,资源组可能会占满,导致作业都在等待资源,作业运行变慢。您可以通过odps.stage.mapper.split.size、odps.stage.reducer.num、odps.stage.joiner.num或odps.stage.num参数调整并行度。更多参数信息,请参见SET操作。
- 购买计算资源:
增购计算资源,请参见升级。
- 使用按量计费资源:
购买按量计费规格,并通过MaxCompute管家设置包年包月项目使用按量计费资源。
数据倾斜
问题现象Fuxi Task中大多数Fuxi Instance都已经结束了,但是部分Fuxi Instance迟迟不结束,出现长尾(Long-Tails)情况。
您可以在Logview的Job Details页签的Fuxi Instance区域,单击Long-Tails,查看出现长尾情况的Fuxi Instance。

Fuxi Instance处理的数据多或Fuxi Instance负责处理特殊数据。
解决措施数据倾斜的详细解决措施,请参见数据倾斜优化。
代码逻辑问题
问题现象- 现象一:数据膨胀。Fuxi Task的输出数据量比输入数据量大很多。
输入、输出数据量可通过Fuxi Task区域的I/O Record和I/O Bytes参数获取。如下图所示,1 GB的数据经过处理变为了1 TB,一个Fuxi Instance处理1 TB的数据,会降低运行效率。
- 现象二:UDF执行效率低。
某个Fuxi Task执行效率低,且该Fuxi Task中有UDF。当UDF执行超时报错
Fuxi job failed - WorkerRestart errCode:252,errMsg:kInstanceMonitorTimeout, usually caused by bad udf performance
。您可以通过如下步骤查看UDF的位置及执行速度:- 在作业运行结果信息中获取Logview链接并在浏览器中打开。
- 在作业执行图区域,双击运行速度慢或运行失败的Fuxi Task,在Operator算子图中查看UDF的位置。如下图所示。
- 在Fuxi Instance区域,单击StdOut,查看UDF的执行速度。
通常,
Speed(records/s)
在百万或者十万级别。
- 现象一:实际业务处理逻辑导致出现数据膨胀,需要确认业务逻辑是否存在问题。
- 现象二:UDF代码逻辑不合理,需要调整代码逻辑。