在实际业务开发过程中,企业通常要求作业能在期望的时间节点前产出结果,并根据结果做进一步决策,这就需要作业开发人员及时关注作业运行状态,识别并优化慢作业。您可以通过MaxCompute的Logview功能诊断慢作业。本文为您介绍导致出现慢作业的原因及如何查看慢作业并提供对应的解决措施。

背景信息

MaxCompute提供的Logview功能会记录作业的全部运行阶段日志信息,为查看和调式作业提供指导依据。您可以通过作业运行结果中的Log View处获取Logview链接。MaxCompute提供了2个版本的Logview功能,推荐您使用Logview 2.0,页面加载速度、设计风格更优。更多Logview 2.0信息,请参见Logview 2.0

出现慢作业的常见情形如下:
  • 计算资源不足

    当MaxCompute项目的计费模式为包年包月时,如果某一时间段内提交的作业数量较多或小文件过多,会导致购买的计算资源(CU)全部占满,作业变为排队状态。

  • 数据倾斜

    当处理的数据量很大或某些作业专门用于处理特定数据时,会导致出现大部分作业已经运行结束但某些作业迟迟不结束的长尾(Long-Tails)情况。

  • 代码逻辑问题

    当SQL或UDF逻辑低效,或没有使用最优的参数设定时,会导致出现Fuxi Task的运行时间很长,但Fuxi Task下每个Fuxi Instance的运行时间都很均匀的情况。作业、Fuxi Task、Fuxi Instance间的关系请参见作业详情

计算资源不足

问题现象
提交作业后,有如下两种表现:
  • 现象一:作业一直显示Job Queueing...状态。

    可能因其他作业占用了资源组的资源,出现作业排队情况。您可以通过如下步骤查看作业等待时长:

    1. 在作业运行结果信息中获取Logview链接并在浏览器中打开。获取Logview
    2. SubStatusHistory页签的Description列查看Waiting for scheduling对应的Latency值,即为等待时长。等待时长
  • 现象二:作业有进展但执行速度慢。
    提交作业后,由于所需计算资源较多,当前的资源组不能同时启动所有的Fuxi Instance,作业虽然有进度但执行不快。您可以通过如下步骤查看作业执行状态:
    1. 在作业运行结果信息中获取Logview链接并在浏览器中打开。
    2. Job Details页签的Fuxi Instance区域,单击Latency Chart,查看作业运行状态图。
      下图展示的是一个资源充足的作业的运行状态,蓝色部分的低端是平齐的,表明所有的Fuxi Instance几乎在同一时间启动。作业运行状态-资源充足

      下图展示的是一个资源不充足的作业的运行状态,图形整体呈现阶梯向上的形态,表明作业的Fuxi Instance是逐步调度起来的。

      作业运行状态-资源不足
产生原因
针对上述现象,您可以按照如下操作确认产生原因:
  1. 进入MaxCompute管家
  2. 在左侧导航栏,单击配额配额
  3. 包年包月配额组区域,单击MaxCompute项目对应的配额组。
  4. 资源消耗页签的预留CU资源使用趋势图中,单击计算资源使用量最高的点,记录时间点。查看时间点
  5. 在左侧导航栏,单击作业后,在右侧单击作业管理
  6. 在作业管理页面,根据记录的时间点填写日期范围,在作业状态下拉列表选择Running,单击确定
  7. 在作业列表区域,单击CPU使用占比(%)后的降序图标,将作业按照CPU使用量占比降序排列。
    • 如果某个作业占用CPU特别大,单击作业操作列的Logview,在Fuxi Instance区域查看I/O Bytes。当I/O Bytes只有1 MB或几十KB,且作业的并行度很高(多个Fuxi Instance)时,表明读取表的小文件过多,需要合并小文件或调整并行度。
    • 如果CPU占比均匀说明同时提交了多个大作业,占满了计算资源。您需要增购计算资源或将作业使用按量计费资源运行。
解决措施
  • 合并小文件:
  • 调整并行度:

    MaxCompute的并行度会根据输入的数据量和作业复杂度自动推测执行,一般不需要调节,理想情况并行度越大速度处理越快。但是对于包年包月资源组,资源组可能会占满,导致作业都在等待资源,作业运行变慢。您可以通过odps.stage.mapper.split.sizeodps.stage.reducer.numodps.stage.joiner.numodps.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 RecordI/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的位置及执行速度:
    1. 在作业运行结果信息中获取Logview链接并在浏览器中打开。
    2. 在作业执行图区域,双击运行速度慢或运行失败的Fuxi Task,在Operator算子图中查看UDF的位置。如下图所示。查看UDF
    3. 在Fuxi Instance区域,单击StdOut,查看UDF的执行速度。

      通常,Speed(records/s) 在百万或者十万级别。

      StdOut
产生原因
  • 现象一:实际业务处理逻辑导致出现数据膨胀,需要确认业务逻辑是否存在问题。
  • 现象二:UDF代码逻辑不合理,需要调整代码逻辑。
解决措施
  • 现象一的解决措施:确认业务逻辑是否存在问题,如果存在问题请修改;如果不存在问题,请通过odps.stage.mapper.split.sizeodps.stage.reducer.numodps.stage.joiner.numodps.stage.num参数调整并行度。更多参数信息,请参见SET操作
  • 现象二的解决措施:检查并修改UDF代码逻辑,优先使用内建函数实现,如果内建函数无法满足业务需求,再考虑使用UDF。更多内建函数信息,请参见内建函数