Apache Airflow是一个开源平台,用于编排复杂的计算工作流和数据处理管道。气流的优势之一是它能够参数化工作流,这允许更多的动态和可重用代码。在本文中,我们将探讨支持参数化的两个强大的airflow特性:变量和模板。
Airflow变量
在Airflow中,变量是一种存储和检索任意内容或设置的方法,作为UI中的简单键值存储。它们可以在dag(有向无环图)中用于参数化任务,并确保敏感信息不会硬编码到你的流程中。在 Airflow 中,变量大致可以分为两种类型:简单类型(如字符串、整数、布尔值等)和支持 JSON 序列化的类型(通常是字典或列表这种复杂数据结构)。
JSON类型的变量主要是字典(dict
)和列表(list
)。字典可以用于存储键值对形式的信息,这在 Airflow 中非常有用。例如,当你需要存储数据库连接信息时,你可以将主机名、端口、用户名、密码等作为键值对存储在单个字典变量中,像{"host": "localhost", "port": 5432, "user": "admin", "password": "secret"}
。
列表类型的变量可以用于存储一系列相关的元素。比如,如果你有多个数据源的配置信息,你可以将每个数据源的配置字典作为一个元素存储在一个列表变量中,方便在任务中进行遍历和处理。
要在“airflow”中设置变量,您可以使用“airflow”UI或命令行。
下面是如何使用命令行设置变量:
$ airflow variables set 'my_key' 'my_value'
要在DAG中使用变量,可以使用Variable.get方法:
from airflow.models import Variable
my_variable = Variable.get("my_key")
利用Jinja模板
Airflow支持Jinja模板,它允许在运行时向任务参数动态注入值。当您的任务可以在每次运行时使用不同的参数执行时,这一点特别有用。
例如,如果你想传递日期作为参数给你的任务,你可以使用Jinja模板:
from airflow.operators.bash_operator import BashOperator
task = BashOperator(
task_id='print_date',
bash_command='echo {{ ds }}',
dag=dag,
)
在上面的例子中,{{ds}}是一个模板变量,当任务运行时,它被DAG的执行日期所替换。
结合变量和模板
你也可以在你的Jinja模板中使用气流变量来获得更大的灵活性:
task = BashOperator(
task_id='templated_task',
bash_command='echo {{ var.value.my_key }}',
dag=dag,
)
这将在执行任务时打印my_key变量的值。
常用运行时变量
-
execution_date
定义与用途:这是 Airflow 中非常重要的一个运行时变量。在 DAG(有向无环图)运行时,
execution_date
代表了任务实例被调度执行的日期(时间)。对于按时间计划运行的任务,如每天、每周或每月执行的任务,execution_date
指定了任务应该处理的数据的逻辑日期。例如,对于一个每天凌晨 2 点执行的数据处理任务,execution_date
在每次运行时会被设置为当天的日期(在 Airflow 内部,它是一个包含日期和时间的pendulum.DateTime
对象)。应用场景:在数据处理任务中,通常会根据
execution_date
来确定要读取和处理的数据范围。比如,一个 ETL(抽取、转换、加载)任务可能会根据execution_date
来查询数据库中当天的数据进行处理。假设你有一个从数据库中提取销售数据的任务,你可以使用execution_date
来构建 SQL 查询语句,只提取在execution_date
对应的日期范围内的销售记录。 -
prev_execution_date
和next_execution_date
定义与用途:
prev_execution_date
和next_execution_date
是与execution_date
相关的变量。prev_execution_date
表示上一次任务执行的日期,next_execution_date
表示下一次任务执行的日期。这些变量对于处理时间序列数据和依赖于历史或未来任务执行情况的任务非常有用。应用场景:在一些需要比较相邻时间周期数据的任务中,如计算数据的环比增长。例如,一个任务需要计算每日销售数据的环比增长,它可以使用
prev_execution_date
和execution_date
来分别获取前一天和当天的销售数据,然后计算增长率。同时,在任务调度的规划中,next_execution_date
可以用于提前准备下一次任务执行所需的资源或条件。 -
run_id
定义与用途:
run_id
是一个唯一标识任务实例运行的标识符。每次 DAG 运行时,都会生成一个新的run_id
。它可以用于跟踪和区分不同次的任务运行,尤其是在需要查看特定运行的详细信息(如日志、状态变化等)时非常有用。应用场景:在调试和监控任务时,通过
run_id
可以快速定位到特定的任务运行实例。例如,当一个任务出现异常时,你可以根据run_id
在 Airflow 的日志系统中查找对应的日志文件,查看在该次运行中任务的具体执行情况,包括输入参数、中间结果和错误信息等。 -
dag_run.conf
定义与用途:当通过外部方式(如 REST API)触发 DAG 运行并传递配置参数时,这些参数会存储在
dag_run.conf
变量中。它允许用户在运行 DAG 时灵活地指定一些额外的信息,这些信息可以在任务中被访问和使用。应用场景:假设你有一个可以处理多种数据格式的 DAG,通过 REST API 触发 DAG 运行时,可以在
dag_run.conf
中传入数据格式相关的参数(如{"data_format": "csv"}
)。然后在任务中,可以根据dag_run.conf
获取这个参数,并根据指定的数据格式进行相应的数据处理操作。
最佳实践
- 避免硬编码:在dag中使用变量而不是硬编码值。
- 敏感数据:对于密码或API密钥等敏感信息,请考虑使用airflow的连接。
- 小心使用模板:要注意如何使用模板来防止注入漏洞。
- 可维护性:给模板和变量编写文档,使其他人更容易理解你的流程。