AIRFLOW:如何设置对多个任务运行的依赖性

时间:2018-05-18 10:49:37

标签: python-3.x etl airflow

我正在建立一个DAG,其中包括简化三个主要任务:

Extraction(today)     >> Fitting(today)
Extraction(yesterday) >> Fitting(today)

Fitting(yesterday)    >> Eval(today)
Extraction(today)     >> Eval(today)

所以我想用今天和昨天的数据提取来提供今天的模型,并希望根据今天的数据提取来评估昨天的模型。

我可以把这些中的每一个写成不同的任务,但我想避免运行昨天的数据提取,如果它已经在昨天完成了。对于模型拟合也是如此,因此我想在DAG中将与当前DAG具有不同execution_date的任务引用。将execution_date作为参数传递似乎不是解决方案,实际上会产生

Broken DAG: [/var/lib/airflow/dags/test_dag.py] Dependency <Task(DummyOperator): fitting>, extraction already registered

因为气流认为我将相同的extraction任务分配两次作为fit任务的依赖项。

这是我的代码:

fit = DummyOperator(task_id='fitting',
                    depends_on_past=True,
                    dag=dag)

fit >> dag

fit.set_upstream([DummyOperator(task_id='extraction',
                                depends_on_past=False,
                                dag=dag,
                                execution_date=datetime(2018, 5, 18)
                                ),
                  DummyOperator(task_id='extraction',
                                depends_on_past=False,
                                dag=dag,
                                execution_date=datetime(2018, 5, 17)
                                )
                  ])

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您收到的错误是因为task_id应该是唯一的,并且您使用了相同的task_id='extraction'两次。

您可以使用以下代码:

fit = DummyOperator(task_id='fitting',
                    dag=dag)

extract_yday = DummyOperator(task_id='extract_yday',
                             dag=dag)

extract_today = DummyOperator(task_id='extract_today',
                              dag=dag)

extract_yday >> fit
extract_today >> fit

此外,您还可以使用Airflow Macros作为今天和昨天的日期:{{ ds }}{{ yesterday_ds }}将其传递给您的运营商。