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.jsonDAG 内使用
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 行为,复现口径时谁也说不清当时用的是哪个值。