You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断DAG中是否存在任务执行失败?

问题

在DAG任务流中,如何判断其中是否有任意任务执行失败?

假设我有如下简化版的DAG:
简化版DAG包含起始节点、并行执行的中间任务201和202,以及FINAL节点——只有201和202全部执行成功,FINAL节点才会启动;若其中任意一个中间任务失败,FINAL节点将不会运行。

我可以逐个检查中间任务的状态,但随着任务数量增加会变得繁琐,因此希望能直接判断DAG中是否有任意任务失败。

我最初的思路是检查最终任务的状态:

SELECT NAME, STATE, ERROR_CODE, ERROR_MESSAGE, QUERY_START_TIME, COMPLETED_TIME
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())
WHERE NAME = 'ANRUFGRUENDE_FINAL_TSK'
QUALIFY ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY COMPLETED_TIME DESC NULLS LAST) = 1 -- 仅显示最新运行记录

但上游任务失败时该最终任务不会执行,此方法不可行。我可以通过最终任务未按预期运行来推断上游失败,但更希望获得直接的判断信号。请问最优解决方案是什么?

最优解决方案

可以通过查询同一DAG关联的所有任务的最新运行状态,直接筛选出失败任务,无需逐个检查,以下是两种实用方案:

方案1:按任务统一前缀批量查询最新状态

如果你的DAG任务有统一命名前缀(比如均包含ANRUFGRUENDE_),可直接批量查询这些任务的最新运行记录,筛选失败状态:

SELECT 
    NAME, 
    STATE, 
    ERROR_CODE, 
    ERROR_MESSAGE, 
    QUERY_START_TIME, 
    COMPLETED_TIME
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())
WHERE NAME LIKE 'ANRUFGRUENDE_%' -- 匹配DAG下所有任务
QUALIFY ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY COMPLETED_TIME DESC NULLS LAST) = 1
AND STATE IN ('FAILED', 'FAILED_WITH_ERROR') -- 筛选失败状态的任务
ORDER BY COMPLETED_TIME DESC;

该查询会返回DAG下所有任务的最新运行结果,只要有任务处于失败状态,就能直接看到对应的任务名称和错误详情。

方案2:结合时间范围定位同一轮DAG执行的失败任务

如果需要避免跨批次历史失败记录的干扰,精准定位同一轮DAG执行中的失败任务,可以通过任务调度时间锁定时间窗口:

WITH latest_dag_run AS (
    -- 获取DAG下所有任务的最新调度时间,锁定最近一次执行的时间范围
    SELECT DATEADD(MINUTE, -30, MAX(SCHEDULED_TIME)) AS time_window_start,
           MAX(SCHEDULED_TIME) AS time_window_end
    FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY())
    WHERE NAME LIKE 'ANRUFGRUENDE_%'
)
SELECT 
    th.NAME, 
    th.STATE, 
    th.ERROR_CODE, 
    th.ERROR_MESSAGE, 
    th.QUERY_START_TIME, 
    th.COMPLETED_TIME
FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY()) th
CROSS JOIN latest_dag_run ldr
WHERE th.NAME LIKE 'ANRUFGRUENDE_%'
AND th.SCHEDULED_TIME BETWEEN ldr.time_window_start AND ldr.time_window_end
AND th.STATE IN ('FAILED', 'FAILED_WITH_ERROR')
ORDER BY th.COMPLETED_TIME DESC;

这个方法先锁定最近一次DAG调度的时间窗口,只查询该窗口内的任务运行记录,确保结果是同一轮执行中的失败任务,精准度更高。

补充提示

  • Snowflake的INFORMATION_SCHEMA.TASK_HISTORY()视图中,任务失败状态通常为FAILED或FAILED_WITH_ERROR,可根据实际环境调整状态值。
  • 若你的DAG通过AFTER关键字设置了任务依赖,还可结合PREDECESSOR_TASK_NAME字段追踪失败任务的上下游关联,但批量查询前缀的方法已能覆盖大部分场景需求。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:40:13