如何判断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
相关产品推荐
相关产品推荐

