首页/数据/数据工程与 ETL 速查/Airflow XCom 跨任务传参

Airflow XCom 跨任务传参

XCom 用于任务之间传递少量数据:push 写入、pull 读取,TaskFlow 下自动处理;底层存在元数据库中,跨任务传大对象会明显拖慢调度。

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 一次大数据更省元数据库。

易错点

  • 用 XCom 传数据内容本身而不是路径,元数据库膨胀、调度界面变慢
  • xcom_pull 未指定 task_ids 或 key,取到了意料之外的最后一个值
  • 跨 DAG 依赖 XCom 取值,运行期拿到空值,下游任务按空值继续执行
  • 大量任务频繁读写 XCom,元数据库成为整个调度的性能瓶颈

数据来源与参考

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