init: airflow_demo 初始化示例 DAG 集合

This commit is contained in:
2026-10-13 14:14:04 +08:00
commit 69a1df7aa0
12 changed files with 1112 additions and 0 deletions
+110
View File
@@ -0,0 +1,110 @@
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.dummy import DummyOperator
# 导入 HiveOperator,用于执行 Hive SQL,目前暂时不使用
# from airflow.providers.apache.hive.operators.hive import HiveOperator
# 导入外部任务传感器:等待其他 DAG 中的任务完成
from airflow.sensors.external_task import ExternalTaskSensor
# 导入文件传感器:等待指定文件出现
from airflow.sensors.filesystem import FileSensor
from datetime import datetime, timedelta
# 定义一个 DAG,即一组具有依赖关系的任务
with DAG(
dag_id='file_sensor_example', # DAG 的唯一标识
schedule_interval=None, # 不设置定时调度,需要手动触发 DAG
start_date=datetime(2024, 10, 1), # DAG 的开始日期
catchup=False, # 不补执行过去未运行的调度任务
tags=["demo"] # 给 DAG 添加标签,方便在 Web 页面筛选
) as dag:
# 1. 开始任务
# DummyOperator 是一个空操作任务,本身不执行实际业务逻辑。
# 通常用于标记工作流的开始、结束,或者组织任务依赖关系。
start = DummyOperator(
task_id="start" # 当前任务的唯一标识
)
# 2. 文件传感器
# FileSensor 本质上也是一个 Operator。
# 它会反复检查指定文件是否存在,满足条件后才允许下游任务执行。
wait_for_file = FileSensor(
task_id='wait_for_file', # 任务 ID
filepath='/home/hadoop/app/airflow/success', # 等待出现的文件路径
fs_conn_id='fs_default', # 文件系统连接 ID
poke_interval=5, # 每隔 5 秒检查一次
timeout=30, # 最多等待 30 秒
mode='poke' # 使用 poke 模式
# poke 模式下,传感器每次检查后继续占用 Worker 工作槽等待。
# 超过 timeout 仍未检测到文件,则任务超时失败。
)
# 3. 外部任务传感器
# ExternalTaskSensor 用来等待另一个 DAG 中的指定任务。
# 只有满足指定的外部任务状态条件后,当前传感器才会成功。
wait_for_other_task = ExternalTaskSensor(
task_id='wait_for_other_task', # 当前传感器的任务 ID
external_dag_id='ods', # 要等待的外部 DAG ID
external_task_id='user_ods', # 要等待的外部任务 ID
# 当前 DAG 运行时,查找逻辑日期早 1 天的外部任务运行记录。
# 例如,当前逻辑日期为 10 月 12 日,
# 则查找逻辑日期为 10 月 11 日的 ods.user_ods。
execution_delta=timedelta(days=1),
allowed_states=["success"], # 外部任务成功后,传感器才成功
poke_interval=5, # 每隔 5 秒检查一次外部任务状态
timeout=3600, # 最多等待 3600 秒,也就是 1 小时
# 未指定 mode 时,默认通常为 poke。
# 传感器会持续轮询外部任务状态。
)
# 4. Hive 任务示例
# HiveOperator 用于提交并执行 Hive SQL。
# 目前整段代码被注释,因此不会创建这个任务。
#
# user_dwd_task = HiveOperator(
# task_id='all_finished', # Hive 任务 ID
# hql="""
# insert overwrite xxx
# select ....
# """ # 需要执行的 Hive SQL
# )
# 5. Bash 任务
# BashOperator 用于执行 Linux Shell 命令。
some_task = BashOperator(
task_id='all_finished', # 当前任务的唯一标识
# {{ ts }} 是 Airflow 模板变量,运行时会被替换为当前 DAG Run 的逻辑时间戳。
bash_command='echo "Execution time is {{ ts }}"'
)
# 6. 定义任务之间的依赖关系
# >> 表示设置执行顺序:左侧任务成功后,右侧任务才能执行。
#
# 执行顺序:
# start → wait_for_file → some_task
#
# 即:
# ① 执行 start;
# ② 等待指定文件出现;
# ③ 文件检测成功后,执行 Bash 命令。
start >> wait_for_file >> some_task
# 7. 外部任务依赖示例(当前已注释,不会生效)
# 如果需要等待 ods DAG 中的 user_ods 任务成功,
# 然后再执行 user_dwd_task,可以配置下面的依赖关系。
#
# start >> wait_for_other_task >> user_dwd_task
#
# 注意:
# 当前 user_dwd_task 的定义也被注释了,因此不能直接启用上面的依赖。
# 此外,ExternalTaskSensor 虽然已经定义,但当前没有连接到任何任务,
# 所以它不会按照这条工作流依赖链执行。