Files
airflow_demo/xcom_example.py
T

100 lines
2.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 导入 DAG 类,用于定义工作流
from airflow import DAG
# 导入 PythonOperator,用于执行 Python 函数
from airflow.operators.python import PythonOperator
# 导入 datetime,用于设置 DAG 的开始日期
from datetime import datetime
def push_data(**context):
"""
向 xcom 推送数据的任务。
**context:接收 Airflow 传入的上下文参数。
其中包含 ti(TaskInstance),可以通过 ti 操作 xcom。
"""
# 获取当前任务实例,并向 xcom 写入一条数据
# key='my_key':xcom 数据的键
# value='my_value':实际存储的数据
context['ti'].xcom_push(
key='my_key',
value='my_value'
)
# 返回一个字符串
# PythonOperator 默认会将函数返回值自动保存到 xcom
# 默认的 xcom key 是 'return_value'
return "默认的push"
def pull_data(**context):
"""
从上游任务的 xcom 中读取数据。
"""
# 获取当前任务实例(TaskInstance)
ti = context['ti']
# 从 push_task 任务中读取 key 为 my_key 的数据
# 这里读取的是之前通过 xcom_push() 手动推送的数据
value = ti.xcom_pull(
task_ids='push_task',
key='my_key'
)
# 从 push_task 任务中读取默认的返回值
# PythonOperator 会将 push_data() 的返回值
# 自动保存到 key='return_value' 对应的 xcom 中
return_value = ti.xcom_pull(
task_ids='push_task',
key='return_value'
)
# 将获取到的数据输出到任务日志中,方便查看执行结果
print(f'Pulled value: {value}')
print(f'return_value: {return_value}')
# 定义一个 DAG,即 Airflow 工作流
with DAG(
# DAG 的唯一标识符
dag_id='xcom_example',
# DAG 的开始日期
# 注意:开始日期不代表 DAG 会在这一天自动执行
start_date=datetime(2024, 10, 1),
# 不设置定时调度,通常需要手动触发 DAG
schedule_interval=None,
# 不补执行历史上未运行的调度任务
catchup=False,
# 为 DAG 添加标签,方便在 Airflow 页面中筛选
tags=["demo"]
) as dag:
# 定义第一个任务:向 xcom 写入数据
push_task = PythonOperator(
# 任务的唯一标识符
task_id='push_task',
# 指定需要执行的 Python 函数
python_callable=push_data
)
# 定义第二个任务:从 xcom 读取数据
pull_task = PythonOperator(
# 任务的唯一标识符
task_id='pull_task',
# 指定需要执行的 Python 函数
python_callable=pull_data
)
# 设置任务依赖关系:
# push_task 必须先成功完成,pull_task 才会执行
push_task >> pull_task