整个DAG

时间:2017-11-28 14:24:13

标签: airflow apache-airflow airflow-scheduler

对于整个DagRun,是否有使用depends_on_past的气流方式,而不仅仅是应用于任务?

我有一个每日DAG,而周五DagRun在第四个任务上出错了,但周六和周日DagRuns仍按预定运行。使用depends_on_past = True会在相同的第4个任务上暂停DagRun,但前3个任务仍然会运行。

我可以在DagRun数据库表中看到,state列包含星期五DagRun的failed。我想要的是一种方法,如果前一个DagRun失败,配置DagRun不启动,在找到之前失败的任务之前不启动和运行。

有人知道这是否可行?

3 个答案:

答案 0 :(得分:5)

在第一个任务中,设置depends_on_past=Truewait_for_downstream=True,组合将导致当前dag-run仅在上次运行成功时运行。

因为通过在当前dag-run设置第一个任务将等待之前的任务  (depends_on_past)和所有任务(wait_for_downstream)成功

答案 1 :(得分:5)

这个问题有点老了,但它是第一个Google搜索结果,而评分最高的答案显然是令人误解的(这使我有些挣扎),因此肯定需要一个正确的答案。尽管第二个等级的答案应该可行,但是有一种 cleaner 方式可以做到这一点,我个人发现使用xcom很难。

Airflow具有特殊的操作员类别,旨在监视其他dag运行或其他dag整体的任务状态。因此,我们需要做的是在dag中的所有任务之前添加一个任务,检查先前的运行是否成功。

from airflow.sensors.external_task_sensor import ExternalTaskSensor


previous_dag_run_sensor = ExternalTaskSensor(
    task_id = 'previous_dag_run_sensor',
    dag = our_dag,
    external_dag_id = our_dag.dag_id,
    execution_delta = our_dag.schedule_interval
)

previous_dag_run_sensor.set_downstream(vertices_of_indegree_zero_from_our_dag)

答案 2 :(得分:3)

一种可能的解决方案是使用xcom

  1. 向DAG添加2个PythonOperators start_taskend_task
  2. 使所有其他任务取决于start_task
  3. end_task依赖于所有其他任务(set_upstream)。
  4. end_task将始终将变量last_success = context['execution_date']推送到xcom(xcom_push)。 (PythonOperators中需要provide_context = True)。
  5. start_task将始终检查xcom(xcom_pull)以查看是否存在last_success变量,其值等于之前的DagRun的execution_date或DAG&#39 ; s start_date(让进程启动)。
  6. xcom的使用示例:
    https://github.com/apache/incubator-airflow/blob/master/airflow/example_dags/example_xcom.py