Airflow 气流:故障后如何停止下一次dag运行

Airflow 气流:故障后如何停止下一次dag运行,airflow,Airflow,我想看看,如果前一次dag运行失败,是否有一种简单的方法不启动下一次dag运行。我已经设置了依赖于\u过去=True,等待\u下游=True,最大活动\u运行次数=1 我拥有的是任务1、2、3,其中: 创造资源 运行作业 摧毁资源 任务3始终以trigger\u rule=all\u done运行,以确保我们始终中断资源。我看到的是,如果任务2失败,然后任务3成功,下一个dag运行将启动,如果我有wait_for u down=False它将运行任务1,因为上一个任务1成功,如果我有wait_f

我想看看,如果前一次dag运行失败,是否有一种简单的方法不启动下一次dag运行。我已经设置了
依赖于\u过去=True
等待\u下游=True
最大活动\u运行次数=1

我拥有的是任务1、2、3,其中:

  • 创造资源
  • 运行作业
  • 摧毁资源
  • 任务3始终以
    trigger\u rule=all\u done
    运行,以确保我们始终中断资源。我看到的是,如果任务2失败,然后任务3成功,下一个dag运行将启动,如果我有
    wait_for u down=False
    它将运行任务1,因为上一个任务1成功,如果我有
    wait_for u down=true
    则它不会像我预期的那样启动dag,这是完美的

    问题是,如果任务1和2成功,但任务3由于某种原因失败,现在我的下一次dag运行将启动,任务1将立即运行,因为任务1和任务2(由于
    等待下游
    )在上一次运行中都成功。这是最坏的情况,因为任务1创建了资源,然后作业永远不会运行,所以资源就放在那里分配

    我最终想要的是阻止dag继续进行下一次dag运行的任何失败。如果我的上一次dag运行被标记为失败,那么下一次运行应该根本不会启动。有没有这样做的机制

    我目前的两个最佳想法是:

  • 使用子dag,以便父dag中只有1个任务,因此,如果上一个任务dag失败,下一个dag运行将永远不会启动。这似乎是可行的,但我看到了关于使用子dag操作符的各种评论
  • 在dag中执行某种逻辑,作为手动查询DB的第一个任务,查看dag是否有以前的故障,如果有,则使任务失败。这似乎有点老套,也不理想,但它也可以工作

  • 有现成的解决方案吗?如果不是运行1的所有步骤都成功,或者运行1本身被标记为失败,则不希望在出现故障时继续运行,也不希望步骤1开始运行2似乎是相当标准的。

    原因取决于过去的对您没有帮助,因为它是任务参数而不是dag参数

    基本上,您要求的是在发生故障后禁用dag

    我可以想象这方面的有效用例,也许我们应该添加一个
    AirflowDisableDagException
    来触发这一点

    这样做的问题是,您有可能会禁用dag,并且在几天或几周内没有注意到

    更好的解决方案是将恢复或中止逻辑构建到管道中,这样就不需要禁用dag

    一种方法是在dag的开头添加一个清理任务,该任务可以检查资源是否留在那里,并在适当的情况下将其删除,如果出现适当的错误,则立即使dag运行失败。可以考虑使用气流<代码>变量< /COD>或<代码> XCOM>代码>来存储资源的状态。

    尽管存在风险,另一种选择是禁用dag方法:如果您的流程未能适当地分解资源,请禁用dag。按照这些思路应该可以做到:

    类MyOp(基本运算符):
    def disable_dag(自身):
    orm_dag=DagModel(dag_id=self.dag_id)
    orm_dag.set_已暂停(is_paused=True)
    def执行(自身、上下文):
    尝试:
    打印(‘某物’)
    除拆卸失败错误外:
    self.disable_dag()
    
    ExternalTaskSensor可以工作,执行增量为datetime.timedelta(天=1)。发件人:

    execution_delta(datetime.timedelta)–与要查看的上一次执行的时间差,默认值为与当前任务或DAG相同的执行日期。对于昨天,使用[positive!]datetime.timedelta(days=1)。可以将执行增量或执行日期传递给ExternalTaskSensor,但不能同时传递两者

    我只使用它来等待上游DAG的完成,但似乎它应该作为自参考,因为DAG_id和task_id是传感器的参数。当然,你要先测试一下