如何限制Airflow一次只运行1个DAG?

时间:2018-03-12 08:58:53

标签: python concurrency airflow

我希望在下一次运行的第一个任务执行之前,DAG中的所有任务都完成。

我有max_active_runs = 1,但this仍然发生。

default_args = {
'depends_on_past': True,
'wait_for_downstream': True,
'max_active_runs': 1,
'start_date': datetime(2018, 03, 04),
'owner': 'tin.nguyen',
'email': ['tin.nguyen@example.com'],
'email_on_failure': True,
'email_on_retry': False,
'retries': 3,
'retry_delay': timedelta(minutes=4)
}

dag = DAG('example', default_args=default_args, schedule_interval = schedule_interval)

(我的所有任务都取决于之前的任务。气流版本是1.8.0)

谢谢

4 个答案:

答案 0 :(得分:5)

我改为将max_active_run作为DAG()的参数而不是default_arguments,并且它有效。感谢SimonD给了我这个想法,虽然没有在你的回答中直接指出它。

答案 1 :(得分:3)

'max_active_runs': 1传递给DAG对象是实现此目的的方法。您的设置方式一定存在问题,因为我没有遇到此问题(即使使用1.7.1.3)。

以下是DAG的示例:

dag_args = {
    'owner': 'Owner',
    'depends_on_past': False,
    'start_date': datetime(2018, 01, 1, 12, 00),
    'email_on_failure': False
}

sched = timedelta(hours=1)
dag = DAG(job_id, default_args=dag_args, schedule_interval=sched, max_active_runs=1)

如果你的dag正在运行的任务实际上是子标记,那么你可能还需要将max_active_runs传递给子标记,但不是100%肯定。

答案 2 :(得分:0)

您可以使用xcoms来执行此操作。首先将2个python运算符作为DAG的“开始”和“结束”。将流程设置为:

  

开始--->所有任务---->端

'end'将始终推送变量

  

last_success = context ['execution_date']到xcom(xcom_push)。 (PythonOperators中需要provide_context = True)。

并且'start'将始终检查xcom(xcom_pull)以查看是否存在last_success变量,其值等于前一个DagRun的execution_date或DAG的start_date(让进程启动)。

关注this answer

答案 3 :(得分:0)

实际上,您应该使用DAG_CONCURRENCY = 1作为环境变量。为我工作。