首页/数据/数据工程与 ETL 速查/Airflow Variables 参数化

Airflow Variables 参数化

Variables 存全局配置类小值(阈值、开关、地址),运行时用 Variable.get 读取;高频读取会打元数据库,推荐模板引用方式或在执行器侧缓存。

Variables 适合放什么

Airflow Variables 用来存全局配置类的小值:阈值、开关、地址、时间范围。运行时用 Variable.get 读取,模板里可以直接写 var.value.xxx。因为读取 Variables 会访问元数据库,高频调用会明显增加元数据库压力,所以推荐在模板中引用,或在任务执行前读取一次后缓存使用。

基本信息

写入界面、CLI、API,或环境变量 AIRFLOW_VAR_<KEY>
读取Variable.get(key, deserialize_json=True)
模板引用{{ var.value.key }}
适用范围阈值、开关、小段配置,不适合每天变化的数据参数

典型使用场景

  • 全局阈值:批次大小、采样比例、重试上限
  • 开关控制:是否启用某个下游、是否跳过某项校验
  • 地址配置:告警 webhook、临时目录路径
  • 分环境差异:同一 DAG 在测试与生产使用不同阈值
  • 紧急调整:线上出问题时临时放慢批次,无需改代码发版

CLI 设置变量

CLI 设置变量
# 设置与查看变量
airflow variables set batch_size 500
airflow variables set alert_webhook 'https://ops.example.com/hook'
airflow variables list

# 批量导入导出,便于环境间同步
aflow variables export /tmp/vars.json

DAG 内使用

DAG 内使用
from airflow.models import Variable

batch_size = int(Variable.get("batch_size", default_var="500"))  # 读不到时用默认值
where = "{{ var.value.dw_start_date }}"                          # 模板引用,避免执行期查询
# JSON 变量需要显式解析:Variable.get("retry_policy", deserialize_json=True)

读取方式与代价

方式写法代价
模板引用{{ var.value.key }}渲染时读取,压力较小
Python 读取Variable.get(key)每次调用都访问元数据库
JSON 变量deserialize_json=True不解析只能拿到原始字符串
环境变量AIRFLOW_VAR_KEY无需访问元数据库
在每个任务的执行函数里调用 Variable.get 会造成大量元数据库查询,任务量一大元数据库就成了瓶颈;优先用模板引用或环境变量下发。
把每天都会变化的值(当天的分区、水位)放进 Variables 当参数用,很容易和 DAG 触发参数混淆;这类值更适合由上游任务通过 XCom 传递。

Variables 与 DAG 参数的边界

Variables 的定位是「跨 DAG 共享的慢变量」,而 DAG 触发参数(conf)、XCom 是「单次运行内传递的快变量」。判断标准是变更频率与共享范围:一周都不变的阈值、开关放 Variables;每次运行都可能不同、只在本次运行内有效的东西,走 conf 或 XCom。把两者混用最典型的事故是运维改了 Variable,以为只影响某一天的补数,实际改变了所有正在运行和历史重跑的 DAG 行为,复现口径时谁也说不清当时用的是哪个值。

易错点

  • Variable 存的是 JSON 字符串却忘记 deserialize_json=True,拿到的是未解析的原始字符串
  • 把每天变化的值放进 Variables 当参数用,与 DAG 触发参数混淆,口径反复出错
  • 在高频任务里逐个调用 Variable.get,元数据库连接被占满,调度整体变慢
  • 变量被随意改名或删除,依赖它的 DAG 要等到下次运行才报错,发现问题滞后

数据来源与参考

  • Apache Airflow 官方文档:Variables
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌