我想使用Apache airflow管理几个将来的发行版。 所有这些版本都是预先已知的,我需要确保不会忘记某些数据推送。
问题在于,这些将来的发行版并没有遵循简单的定期时间表,而可以使用经典0 1 23 * *
或类似@monthly
之类的cron来处理。
它是2019-08-24
,2019-09-30
,2019-10-20
...
除了为所有这些将来的版本创建单独的mydag.py
文件之外,还有其他方法吗?这样做的标准/推荐方式是什么?我是否在以错误的方式思考(我想知道是因为文档和教程宁愿关注定期的事情)?
答案 0 :(得分:1)
我可以想到两种简单的方法
创建3-4个顶级DAG,每个DAG具有特定的start_date
= 2019-08-24、2019-09-30 ...和schedule_interval='@once'
创建具有schedule_interval=None
(start_date
可以是任何东西)的单个顶级DAG。然后创建一个“触发数据包”,在特定日期使用TriggerDagRunOperator
至conditionally trigger您的实际工作流
显然,上面的方法2更好
答案 1 :(得分:1)
您可以给DAG一个@daily
时间表,然后从一个ShortCircuitOperator任务开始,检查执行日期是否与发布日期匹配。如果是,则通过检查,DAG将运行。否则,它将跳过整个DAG,并且不会发生释放。请参见在https://github.com/apache/airflow/blob/1.10.3/airflow/example_dags/example_short_circuit_operator.py中使用此运算符的示例。
我想它看起来像这样:
RELEASE_DATES = ['2019-08-24', '2019-09-30', '2019-10-20']
dag = DAG(
dag_id='my_dag',
schedule_interval='@daily',
default_args=default_args,
)
def check_release_date(**context):
# pass if it's a release day
return context['ds'] in RELEASE_DATES
skip_if_not_release_date = ShortCircuitOperator(
task_id='skip_if_not_release_date',
python_callable=check_release_date,
dag=dag,
provide_context=True,
)
如果发布日期可以更改,那么您可能希望使用变量使其更加动态化,以使更新变得容易。
def check_release_date(**context):
release_dates = Variable.get('release_dates', deserialize_json=True)
return context['ds'] in RELEASE_DATES
如果出于任何原因您需要覆盖发行日期的硬编码列表,则可以将此任务标记为成功,以强制DAG运行。