我正在建立一个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)
)
])
知道如何实现这个目标吗?
答案 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 }}
将其传递给您的运营商。