任务诊断最佳实践

更新时间:
复制 MD 格式

DataWorks支持通过大模型的能力来进行任务诊断,其以任务实例 ID 为入口,通过对话输出一句话根因、关键证据和可执行的处置建议,用于定位调度任务失败、未运行、等待资源或明显变慢等异常,面向数据开发、运维和值班人员。诊断过程只读取数据,输出报告和建议,重跑、置成功等处置动作由人工确认后触发。

适用场景

当调度任务异常时,运维值班人员通常需要解决三个核心问题:问题在哪,证据是什么,如何处理。传统的排查方式——逐个查看实例、检索日志、比对依赖——在面对业务催促时会面临较大的压力。

5eecdaf48460cde5a1c336061be5fb06ed2e0231d4ecb7e075b8339e1c4c24831b75b38faadcd24bec177c308ebd53049e23d48ce3dc0bb07f555974d9678a62c8944a19aea20991912776cbd5d988e27c860e2705a1c5e54fb4c8ed7016461c

AI助理服务的任务诊断功能,正是为了自动回答这三个问题而生。它以一个或多个任务实例 ID 为入口,自动串联起调度状态、上下游依赖、运行日志、历史记录及引擎证据,最终提炼出一份精准的诊断报告,其中包含:

  1. 根因结论:问题发生在哪一层,以及当前能够确认的原因。

  2. 关键证据:支持结论的日志、依赖、变更、资源或引擎信息。

  3. 处置建议:与根因直接对应、能够执行的动作。

  4. 结论边界:缺失哪些信息,以及会影响哪部分判断。

重要

安全可控:整个诊断过程均为只读,不会对您的系统做任何修改。所有“重跑”、“置成功”等处置动作,都必须在您人工确认后才会触发。

前提条件

Data Agent和AI助理服务均可支持任务诊断,按实际使用的服务确认前提条件。

使用 Data Agent:

使用 AI 助理服务:

  • 已创建AI助理服务,且实例已正常运行。

  • AI助理服务的镜像版本为 v4.1.8 及以上。

  • 如需在钉钉、飞书或企业微信等IM端使用,需进行 IM通道配置。

诊断流程

运维中心的 Data Agent 与 AI 助理服务都提供任务诊断能力,诊断逻辑与报告结构一致,两者均支持 Web 端和 IM 端对话。任何一种方式,使用流程和报告解读方式均类似。

发起诊断

诊断有对话式和页面版两条路径。页面版在运维中心实例列表单击 运行诊断,按固定步骤展示单个实例的结论,详见 任务运行诊断 与 智能诊断。对话式支持描述现象、跨上下游追溯和多实例归因,使用方式如下。

Web 端入口:

  • Data Agent:登录 DataWorks 控制台,选择目标地域后进入运维中心,在左侧导航栏单击 AI 工作台 > Data Agent,并在会话中选择目标工作空间。

  • AI 助理服务:登录DataWorks 控制台,选择目标地域,在左侧导航栏单击 AI助理服务,找到目标实例后单击操作列的 对话。

IM 端入口:在已配置的 IM 群聊中向对应机器人发送消息。IM 渠道与账号映射的配置方式请参见 AI 助理实战:配置 IM 端账号映射。

提问时提供任务实例 ID,并说明观察到的现象。现象决定诊断优先检查哪一层证据,例如“首次失败、重跑成功”“一直等待资源”或“今天明显变慢”。

重要

必须使用任务实例 ID(数字)。任务 ID、节点 ID、DAG ID、补数据请求 ID 均无法定位到具体运行记录,ID 类型用错是诊断无法开展的最常见原因。

提问示例:

  • 帮我诊断这个实例为什么失败:实例 ID

  • 这个实例一直没有运行,帮我看看卡在哪里:实例 ID

  • 这个实例等待资源很久,是否需要扩容:实例 ID

  • 这个任务今天比平时慢很多,帮我分析一下:实例 ID

  • 这批实例同时异常,帮我找共同原因:实例 ID 列表

1~2 个实例逐个诊断;3 个及以上先做批量诊断识别共性问题,再对重点实例单独深入诊断。

提交后以对话形式返回诊断报告,内容构成与阅读方法参见下文「阅读诊断结果」

阅读诊断结果

报告固定包含四段内容:

  1. 诊断结论:任务名与括号中的当前状态,作为报告标题。

  2. 根因:一句话说明问题发生在哪一层,以及当前能够确认的原因。

  3. 关键证据:支持该结论的日志行号、错误码、原始报错、依赖状态、变更记录或指标数值,构成可复核的证据链。

  4. 建议:与根因直接对应、能够执行的动作,按优先级排列。

另有两段按需出现:与主根因相互独立的问题列在同时发现中,不并入根因;证据缺口与结论适用范围以灰色文字附在报告末尾,说明哪些信息未能采集以及是否影响当前判断。

报告示例

提问 诊断实例 400343389740 为什么一直没有运行,返回的报告如下。

诊断结论:wengzi_test_migration_table_4(未运行)
根因:上游实例阻塞,当前实例尚未被调度执行。
关键证据:
实例状态为 NotRun,触发时间为 2026-08-17 23:55:00,但从未开始运行(startedTime 为空)。
上游阻塞节点为同名任务 wengzi_test_migration_table_4(实例 ID 400343380392),状态同样为 NotRun,形成自依赖或同链路阻塞。
失败链路共 1 个异常节点,即上游自身未运行导致下游无法调度。
该任务为小时调度离线同步任务(MySQL 到 MySQL),已重跑 1 次,但仍未进入运行。
建议:
检查上游实例 400343380392 为何未运行(可能存在更上游的阻塞、冻结或定时未到),解除上游阻塞后当前实例将自动调度。
如确认上游无需等待,可手动重跑当前实例以触发执行。

根据报告内容,进行根因诊断:

  • 阅读顺序:先查看根因,再核对关键证据,最后参考 处理建议。

  • 根因原则:报告仅呈现能直接解释当前实例状态的主根因。当证据不足时,会明确指出当前已确认的范围,避免基于零散信息进行推测。常见的根因现象定位,可参见按现象定位根因。

修复操作

处置前,需区分报告中的三类内容:已确认的问题、可能原因与缺失信息。对依据已确认事实执行操作,并对可能原因和缺失信息进行进一步确认。

明确信息后,对失败的实例进行操作,常见的操作指令如下:

操作目标

指令示例

重跑实例

重跑实例 <任务实例 ID>

调整资源组并发

帮我调高调度并发上限

深入诊断DI实例

对 <任务实例 ID> 做 DI Doctor 深诊

检查表是否存在

帮我查一下这张表是否存在

说明
  • 对于写操作指令(如重跑实例),系统在执行前会展示实例的基础信息,并等待用户确认。

  • 报告的“处理建议”部分也可能主动询问是否需要代为执行相关操作。

按现象定位根因

报告未给出确定结论,或需要了解某类现象的归因逻辑时,按下表定位到对应小节。先判断问题所处阶段(等待时间、等待资源、执行中失败、执行完成但变慢),再查看对应层面的证据。各场景的重点回答与诊断证据如下:

现象

重点回答

诊断依据的证据

任务未运行

等待时间、暂停冻结,还是上游阻塞

实例状态与调度属性、上游实例状态、历史启动趋势、告警规则

等待资源

并发限制还是容量不足,是否需要扩容

资源组信息与水位趋势、历史平均等待资源时长、资源组 CU/Slot 指标

数据集成失败

读取端、写入端、字段、脏数据或网络问题

数据集成任务运行日志解析结果与作业详情入口

Spark 失败或变慢

运行过程中哪一环出现异常

任务执行日志、容器事件与容器详情、CPU/内存/网络/磁盘指标

数据质量(DQC)校验异常

规则未通过,还是校验没有执行成功

实例关联的数据质量规则配置与状态、失败分析中对规则配置的检查

MaxCompute 失败或变慢

调度侧根因与作业执行详情

调度状态、任务运行日志分析、执行链路证据

多实例同时异常

共性问题、影响范围和优先处理实例

工作空间维度的慢任务、失败任务、未运行任务和告警任务清单,按节点分组抽样后归纳共性

各场景的判断顺序、结论示例与易错点如下。

任务未运行

适用于分析处于未运行、等待定时、暂停或等待上游状态的实例。

  • 诊断目标

    准确识别实例未开始运行的原因,并将其与代码、资源等运行期失败区分开。诊断逻辑按以下顺序执行:

    1. 检查定时时间

    2. 检查冻结或暂停状态

    3. 检查上游依赖,若发现上游存在失败链,系统将向上追溯,直至定位到最早需要处理的异常节点。

  • 诊断示例:定位上游失败链

    当前实例未运行,直接阻塞来自上游实例A。进一步追溯发现,实例B是该依赖链中最早的失败节点。建议:优先处理实例B。待其成功后,下游实例将自动恢复调度。
  • 常见诊断结论与处理方式

    结论

    含义

    处理方式

    等待定时

    尚未到触发时间,不属于运行失败

    核对业务日期与定时时间,无需重跑

    暂停或冻结

    实例未真正执行,不判断 SQL 或引擎根因

    确认是否符合预期;需要恢复时先解除暂停或冻结

    等待上游

    指出直接阻塞对象;存在失败链时定位到最早的异常节点

    先处理失败链最上游的根因实例,不逐个重跑下游

    信息不足

    仅能确认实例未运行

    按报告说明补充缺失的判断依据后重新诊断

说明

常见误区:未运行不等于运行失败,处于等待时间、暂停或冻结状态的实例并未真正执行,不应归因到代码、资源或引擎。上游存在失败链时,只需处理链路最上游的根因实例,不要逐个重跑下游。

等待资源

适用于实例长时间处于等待资源状态的场景。

  • 诊断目标

    准确区分实例排队的原因是并发限制还是资源容量不足,并判断是否需要扩容。诊断逻辑如下:

    1. 首先检查任务自身或其所属工作流的 最大实例数并发限制。

    2. 若未达到并发限制,则进一步分析资源组在实例等待期间的容量瓶颈,综合判断 资源组CU水位、调度并发、排队任务数 及配额。

  • 诊断示例

    结论:资源组的调度并发已达到上限,但在实例等待期间,计算单元(CU)平均水位较低。建议:瓶颈在于调度能力而非计算能力。应优先评估并适当调高资源组的调度并发上限,而不是直接扩容计算资源。
  • 常见诊断结论

    结论

    含义

    处理方式

    最大实例数限制

    瓶颈来自任务或工作流的并发配置,与资源组容量无关

    调整任务或工作流的最大并发实例数

    调度并发达到上限

    调度并发满载,与 CU 水位高低无关

    评估并放宽调度并发上限

    持续容量不足

    等待窗口内持续高水位并伴随排队

    具备扩容依据,按业务时效要求决定是否扩容

    证据不足

    指标缺失或等待窗口过短

    补充观测窗口后重新诊断,不据此扩容

    • 扩容决策不应仅依赖单一指标(如单个时间点的资源水位或总等待时长)。

    • 调高并发、扩容或迁移资源组均为变更操作,执行前必须充分评估其对线上任务的影响。

说明

常见误区:

  • CU 水位低也可能排队,瓶颈可能在调度并发而非计算容量,不应仅凭“等待资源”状态判定需要扩容。

  • 单个时间点的水位、单一计算资源指标或总等待时长,都不足以单独支撑扩容结论。只有等待窗口内持续高水位并伴有排队时,扩容才有较强依据。

  • 是否扩容属于处置建议,需要结合业务时效要求由人工决定。诊断不会自动调整并发或资源规格。

数据集成失败

适用于分析离线同步任务的失败原因,包括当前失败或历史失败。诊断过程结合了DataWorks调度层与数据集成引擎层的信息,进行联合分析。

  • 诊断逻辑

    1. 调度层分析:首先检查实例状态、上游依赖、运行历史和原始日志。

    2. 数据集成引擎层分析:若任务已进入引擎执行,则进一步分析Reader(读取端)、Writer(写入端)、字段映射类型、脏数据策略、数据量及性能证据。

    3. 对于重跑成功但需要分析历史失败的场景,诊断将优先定位并分析对应的历史失败日志。

  • 典型失败场景及处理

    失败模式

    现象

    处理方式

    字段类型不兼容

    Reader 已读取数据,Writer 写入时源端字符串无法转换为目标数值类型,记录全部成为脏数据,而允许的脏数据条数为 0

    修正字段映射、目标字段类型或转换规则,再重新运行验证

    源端连接超时

    Reader 初始化阶段连续连接超时,多次重试后仍未读取到数据

    检查资源组到数据源的连通性、白名单、安全组、地址和端口配置

说明

常见误区:

  • 不要把调高脏数据阈值作为默认修复手段,只有业务明确允许丢弃异常记录时才调整容忍策略。

  • 传输记录为 0 可能由连接、读取或任务初始化等多种原因造成,需要结合原始报错判断。

  • 若存在数据源连通性问题时,在连通性恢复前继续重跑通常无法自愈。

Spark 失败或变慢

适用于分析DataWorks中Spark任务的失败或性能问题。诊断过程会深入Spark应用内部,定位Driver、Stage或Executor的根因。

  • 诊断逻辑

    1. 失败任务:优先定位Driver或Stage的根本性失败原因(如编译错误、资源溢出),而不是分析任务停止、清理等次要日志。

    2. 慢任务:重点分析长尾Task、数据倾斜、Executor丢失等性能问题。

  • 诊断示例

    任务已经进入 Spark 引擎,失败发生在 SQL 分析阶段。Driver 明确提示目标表不存在,因此尚未生成 Job 或 Stage。建议检查表名、项目空间和访问权限后重新运行。

    或:

    未发现 Driver 失败,但某个 Stage 中少量 Task 耗时明显高于其他 Task,存在长尾特征。建议检查数据分布、分区规模和并行度配置。
  • 典型场景及分析

    结论

    含义

    处理方式

    Driver 明确失败

    失败发生在 SQL 分析阶段,尚未生成 Job 或 Stage

    按 Driver 报错检查表名、项目空间和访问权限

    Stage 存在 Task 长尾

    未发现 Driver 失败,但某个 Stage 中少量 Task 耗时明显高于其他 Task

    检查数据分布、分区规模和并行度配置

说明

常见误区:

  • Job 与 Stage 为空不代表没有证据。Driver 在 SQL 分析阶段失败时,尚未生成计算阶段本身就是阶段证据。

  • Driver、Executor 的规格表示配置,不等同于实时 CPU 或内存使用率。

  • 变慢的判断需要和历史平均运行时长对照,单次运行时长本身不构成结论。

  • Spark 作业成功但调度实例失败时,继续检查调度后处理或数据质量环节。

数据质量(DQC)校验异常

适用于分析DataWorks数据质量(DQC)监控规则的执行结果。

  • 诊断逻辑

    诊断的首要目标是区分 “规则执行失败” 与 “规则校验未通过”。

    1. 首先,判断规则是否成功执行。

      • 检查是否存在分区不存在、数据源无法访问、SQL无法生成等 执行失败 问题。若存在,诊断到此为止,结论为执行失败。

    2. 其次,若规则成功执行,则判断校验结果。

      • 分析规则是否 未通过,即数据出现了重复、空值、波动等不符合预期的现象。

    系统会优先输出已确认的事实。仅当证据不足或用户明确要求时,才会进一步分析“为什么”数据不符合规则(如追溯上下游、代码变更等)。
  • 典型场景及分析

    情况

    含义

    处理方式

    规则正常执行但未通过

    确认存在重复、空值或波动等异常现象

    按规则指向的字段与分区核查数据

    校验执行失败

    分区不存在、数据源不可解析或查询 SQL 无法生成,不能解释为数据不符合规则

    先排除执行障碍(如确认上游已产出分区),再重新运行校验

说明

常见误区:

  • 规则未通过首先说明「发生了什么」,不一定说明「为什么发生」。

  • 只有日志明确证明 SQL 执行失败时,才把相应 SQL 标记为失败 SQL。

  • 深入分析得到的可能原因会标明可信程度,并与已确认的规则结果或执行错误分开呈现。

  • 「近期没有代码变更」只能排除变更引入问题,不能证明既有代码没有问题。

MaxCompute 失败或变慢

适用于分析MaxCompute(ODPS)任务的失败或性能问题。诊断过程结合了DataWorks调度层信息与MaxCompute引擎层LogView详情。

  • 诊断逻辑

    1. 调度层分析:首先分析实例状态与运行日志,获取初步结论,如SQL错误、权限问题、变量替换失败等。

    2. 引擎层分析 (LogView):然后,通过匹配的LogView深入引擎层,补充失败阶段、执行时间线、任务分布等证据,用于验证或深化调度层结论。

    原则:调度层已明确的结论(如权限、分区错误)优先级更高。LogView详情用于补充和验证,不会覆盖已有结论。
  • 诊断示例

    调度日志已经确认分区值非法,错误码为 ODPS-0130071,变量 ${bizdate}` 未替换为合法分区值。引擎信息进一步确认作业在完整计算阶段前失败。建议检查调度参数赋值和分区表达式后重新运行。
  • 典型场景及分析

    结论

    含义

    处理方式

    调度侧已确认的错误

    SQL、变量替换、权限、表或分区错误,引擎侧证据仅用于补充失败阶段

    按报错修正配置或代码后重新运行

    数据倾斜、长尾、资源等待或热点算子

    LogView 中存在明确的执行时间和任务分布证据

    依据 LogView 的执行时间线与任务分布定位具体阶段

    运行正常,无性能问题

    各项性能指标均无异常特征

    无需优化

  • 关键原则与能力边界

    • 无有效LogView:若无法获取匹配的LogView,报告将仅返回调度层结论,并说明分析的局限性。

    • 多个Job:单次诊断聚焦于日志中最后一个作业。若存在更早的作业,报告会提示未分析的数量。

    • 数据质量优先:若实例失败的直接原因是数据质量(DQC)校验不通过,诊断将优先展示DQC结论,避免信息冲突。

    • 权限限制:LogView的访问受限于执行诊断的账号权限及作业自身的访问策略。

说明

慢作业判断原则:

只有 LogView 中存在明确的执行时间和任务分布证据时,才判断数据倾斜、长尾、资源等待或热点算子。总耗时高、卡 99% 或失败错误码都不能单独证明性能根因。

多实例同时异常

适用于分析同一业务流程或时间窗口内出现的多个相关异常实例。

  • 诊断目标

    快速分析一批实例,将相似问题归类,并识别出需要优先处理的根因实例。诊断报告将汇总以下信息:

    • 影响范围:受影响的实例状态与数量。

    • 根因实例:建议优先处理的上游根因节点。

    • 问题分组:按相似现象对实例进行分组。

  • 诊断示例

    某工作流中的 3 个下游实例同时未运行。批量诊断还原出连续依赖链:查询节点被汇总节点阻塞,汇总节点又被上游加工节点阻塞,最终收敛到最上游待处理实例。

    本批次 3 个实例均未开始运行,共同现象是上游依赖链尚未完成。建议优先处理依赖链最上游的异常实例,无需分别重跑每个下游节点。
  • 处理建议

    1. 优先使用批量诊断:当同一业务流程或时间窗口出现多个相关失败时,应首先使用批量诊断。

    2. 先处理共性根因:优先处理报告中识别出的根因实例,然后观察下游是否自动恢复。

    3. 区分现象与根因:被归入同一组仅表示 现象相似,不保证其 根因完全相同。

    4. 结合单实例深诊:对于关键实例,或在处理完共性问题后仍未解决的个例,应再进行单实例诊断以获取完整的运行证据。

说明

常见误区:

被归入同一组只表示现象相似,不代表所有实例一定具有完全相同的原因,也不能把相似错误指纹直接等同于相同根因。批量诊断会聚焦具有代表性的任务,需要逐实例完整证据时,再对重点实例单独深入诊断。

能力边界

任务诊断是只读分析,不会自动修改任务代码或调度配置。重跑实例、置成功等写操作属于独立能力,执行前会先展示任务实例的基础信息,并在收到明确确认后才执行。任务代码和数据质量规则配置需要到对应的 DataWorks 页面修改。

诊断结果的完整程度受可获取证据的限制:

  • 上游追溯最多向上 3 层,超出后报告会说明追溯已达上限。

  • 日志较长时,结构化诊断证据可能进行采样。发生采样时,报告会说明证据范围;需要进一步确认时,可结合完整日志继续分析。

  • 部分任务可以进一步获取计算引擎信息;暂时无法获取时,仍会正常返回已经确认的调度诊断结果。

  • 引擎侧异步诊断未在预期时间内完成时,报告会说明诊断尚未返回,可稍后凭诊断标识再次查询。

  • MaxCompute 执行详情依赖运行日志中可访问且与当前作业匹配的 LogView;无法获取时,报告仍返回调度侧结论并说明信息范围。

  • 日志数据源或访问凭证不可用时,报告不会声称已分析过这些日志,而是标明该部分证据缺失。

诊断结果用于定位和决策,不替代变更审批以及修复后的重新运行验证。重跑、置成功、调高并发、扩容或迁移等动作在确认根因后再执行,避免掩盖问题。

常见问题

  • Q:提示无法定位到任务实例,怎么处理?

    A:最常见的原因是 ID 类型用错。诊断只接受任务实例 ID,任务 ID、节点 ID、DAG ID、补数据请求 ID 都无法定位到具体运行记录。任务实例 ID 可在运维中心的实例列表或实例详情页获取。ID 确认无误时,再检查会话中选择的工作空间是否为该实例所属工作空间。

  • Q:报告说引擎侧信息无法获取,是权限问题吗?

    A:不一定。可能是任务类型不在支持获取引擎详情的范围内,也可能是引擎侧异步诊断未在预期时间内返回,或日志数据源与访问凭证不可用。报告会说明属于哪一种,并保留已经确认的调度侧结论。属于异步未返回时,凭报告中的诊断标识稍后再次查询即可。

  • Q:同一个实例两次诊断的结论不一致,为什么?

    A:诊断基于提问时可获取的证据得出结论,而上游状态、资源组水位、引擎侧详情等证据会随时间变化。例如上游完成后重新诊断,原先的“等待上游”结论就不再成立。建议以最新一次诊断为准,并关注报告中的结论边界部分。

  • Q:报告提示上游追溯已达上限,下一步怎么做?

    A:上游追溯最多向上 3 层。达到上限说明阻塞链路较长,报告会给出当前已定位到的最上游实例。可以以该实例为新的起点再发起一次诊断,继续向上收敛。

  • Q:日志很长时,中间部分的报错会被遗漏吗?

    A:有可能。日志超过 500 行时只分析首末各 200 行。已知关键报错位于日志中段时,在提问时直接补充该报错信息,作为现象描述的一部分。

  • Q:任务诊断能否直接重跑实例或修改代码?

    A:不能。诊断只做只读分析。重跑实例与置成功属于独立能力,执行前会展示任务实例的基础信息并等待明确确认。任务代码和数据质量规则配置需要到对应的 DataWorks 页面修改。