在特定日期列表上执行Airflow DAG实例(任务)

时间:2019-07-26 20:36:10

标签: python airflow

我想使用Apache airflow管理几个将来的发行版。 所有这些版本都是预先已知的,我需要确保不会忘记某些数据推送。

问题在于,这些将来的发行版并没有遵循简单的定期时间表,而可以使用经典0 1 23 * *或类似@monthly之类的cron来处理。

它是2019-08-242019-09-302019-10-20 ...

除了为所有这些将来的版本创建单独的mydag.py文件之外,还有其他方法吗?这样做的标准/推荐方式是什么?我是否在以错误的方式思考(我想知道是因为文档和教程宁愿关注定期的事情)?

2 个答案:

答案 0 :(得分:1)

我可以想到两种简单的方法

  1. 创建3-4个顶级DAG,每个DAG具有特定的start_date = 2019-08-24、2019-09-30 ...和schedule_interval='@once'

  2. 创建具有schedule_interval=Nonestart_date可以是任何东西)的单个顶级DAG。然后创建一个“触发数据包”,在特定日期使用TriggerDagRunOperatorconditionally 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运行。