XCom 用来传什么
XCom 是 Airflow 里任务之间传递少量数据的机制:一个任务把值 push 进去,下游任务按 task_id 和 key pull 出来;使用 TaskFlow 装饰器时,函数返回值与参数会自动通过 XCom 传递。XCom 的值会被序列化后存进 Airflow 元数据库的 xcom 表,所以它适合传路径、日期、小配置,不适合传数据本身。
基本信息
| 写入 | ti.xcom_push(key, value),或 TaskFlow 函数的返回值 |
|---|---|
| 读取 | ti.xcom_pull(task_ids=..., key=...) |
| 存储位置 | Airflow 元数据库的 xcom 表 |
| 生命周期 | 随 DAG 运行记录保留,可按策略清理归档 |
典型使用场景
- 传递业务日期或分区值:上游算出 dt,下游用它读对应分区
- 传递文件路径:上游落盘后把路径交给下游加载
- TaskFlow 管道:函数返回值自动成为下游参数
- 传递轻量元数据:行数、校验结果、采样统计
- 调试与核查:在界面查看某个任务 push 了什么内容
push 与 pull
push 与 pull
def push(**context):
context["ti"].xcom_push(key="part", value="dt=2026-10-11") # 写入分区值
def pull(**context):
part = context["ti"].xcom_pull(task_ids="push", key="part") # 按 task_id 和 key 读取
print(part)TaskFlow 自动传参
TaskFlow 自动传参
@task
def a() -> str:
return "dt=2026-10-11" # 返回值自动通过 XCom 传给下游
@task
def b(part: str) -> None:
print(part) # 直接接收上游返回值
b(a())XCom 用法对照
| 场景 | 推荐做法 | 说明 |
|---|---|---|
| 传日期与分区 | xcom_push 单个字符串 | 轻量、可读性好 |
| 传文件 | 返回路径而不是内容 | 下游自行读取文件 |
| TaskFlow 管道 | 函数返回值自动传递 | 无需手写 push 与 pull |
| 传大数据集 | 改用对象存储或数据库 | 避免元数据库膨胀 |
XCom 的值会序列化进元数据库,传百万行数据会让元数据库迅速膨胀、界面卡顿,严重时连调度器的响应都会变慢。
xcom_pull 默认只在同一个 dag_run 内取值,跨 DAG 传参需要另找机制(共享存储、Variables 或消息队列),不要指望 XCom 跨 DAG 生效。
序列化与容量约束
XCom 的值先被序列化再写入元数据库,Airflow 2.x 默认用 JSON 序列化,部分数据类型(如 DataFrame、自定义对象)需要换成 Pickle 或自行转成字符串才能传递。同时 XCom 存在单条大小与总量的隐式约束:写进去容易,清理却要依赖运行记录归档。判断标准很简单——传的是「引用」就放心用 XCom,传的是「数据本身」就该换存储。多个下游要读同一份结果时,让上游落一次盘,把路径发给所有下游,比让每个下游各 pull 一次大数据更省元数据库。