Airflow 中的模板

Templating in Airflow

伙计们,Airflow 还很陌生。我正在尝试将 start_dateend_date 发送到我的 sql 脚本,该脚本将作为我的 DAG 中的任务发送到 运行。我最初的方法是将这些模板化并通过 param 变量将它们发送到 PostgresOperator。像

PostgresOperator(
        task_id='test_edw_job',
        sql='sql/my.sql',
        params={'start_date': start_date, 'end_date': end_date}
    )

其中 start_dateend_date 是定义为

的宏
end_date = "{{ macros.my_plugin.end_date(execution_date) }}"

start_of_month = '{{ macros.my_plugin.start_date(execution_date) }}'

在我的 SQL 文件中,我分别以 {{ param.start_date }}{{ params.end_date }} 访问这些变量。

但是一旦我启动我的 DAG 并查看呈现的任务,它就会将它们模板化为 {{ macros.my_plugin.start_date(execution_date) }}{{ macros.my_plugin.end_date(execution_date) }},因为我试图在此处对这些宏的实际值进行模板化。我在这里做错了什么吗?任何意见都会受到高度赞赏。

因此,深入了解模板在 Airflow 中的工作原理。只有一次 params 会被它的值替换。在我的例子中 paramsstart_dateend_date 本身就是模板,这意味着它们将被相应的宏定义(即 {{ macros.my_plugin.start_date(execution_date) }} )替换,但不会被那些 macros 即类似于 2019-10-10。在进行一些试运行时,我发现我实际上不必将 start_dateend_date 作为参数传递给 PostgresOperator。我可以在我的 Sql 文件中模板化 start_dateend_date,作为模板化初始传递的一部分,这些变量将替换为通过 macros 计算的相应值,表示他们。

希望这对将来像我一样刚接触 airflow 模板的人有所帮助。