【问题标题】:fail task based on depends_on_past in airflow operators气流操作符中基于depends_on_past的任务失败
【发布时间】:2020-08-07 12:59:42
【问题描述】:

假设我有一个任务,其中一项任务依赖于 4 个任务。仅当 dag 之前运行的相同任务成功时,才应触发所有 4 个任务。所以所有的任务都将depends_on_past 设为True。然而,dag 的最后一项任务是清理任务,应始终触发。所以在前一天的任务失败的情况下,当天的任务不会被触发,这样最后的任务也不会被触发。解决这个问题的方法是什么?

【问题讨论】:

    标签: python airflow


    【解决方案1】:

    始终在您的清理任务中设置trigger_rule=TriggerRule.ALL_DONE(那些必须始终运行的任务,无论上游任务的状态如何)


    虽然您似乎已经想到了,但在您的清理任务上设置 depends_on_past=False 也可能有意义

    【讨论】:

    • all_done 只有在上游任务被触发时才有意义,对吧?因此,如果触发了任务,则不管结果如何。如果下游任务有all_done,它将被触发。但是,在depends_on_past 的情况下,不会触发任务。所以 all_done 没有帮助。
    • 明白。 [1] 但是如果你说上游任务根本没有被触发,那么 DAG 的状态是什么? (它还在运行吗?)[2] 一个非常不整洁的解决方案是自己实现这个自定义行为(而不是使用depends_on_past):让你的任务跳过(或者失败,如果你想) 由raising AirflowSkipException or AirflowFailException 手动完成,以防之前的任务实例尚未完成(必须为此查询元数据库或利用 SQLAlchemy TaskInstance 模型)。
    • [1] 是的,它保持在运行状态。 [2] 是的,我可以手动做到这一点。还有一些其他的方法。但是 Airflow 有这个功能但不支持这种情况似乎很奇怪。
    • 但是如果 DAG 保持在运行状态,那么最终清理任务仍然会运行,对吧?我认为你在这里尝试做的事情(一旦一些上游任务因为depends_on_past 而被卡住,就运行清理任务)违背了 Airflow 任务依赖的原则,这就是为什么我看不到任何简单的方法来实现它
    • 我期待,因为上一次运行的任务失败了,当前运行的任务进入某种触发规则可以处理的状态,以便下游任务可以继续进行。但是,是的,我可以理解为什么这样的事情会与depends_on_past 的预期行为相冲突(您修复第一个失败的任务,然后所有后续任务将自动启动)。仍然希望它可以处理我想要解决的这种情况
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多