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 虽然已经定义,但当前没有连接到任何任务, # 所以它不会按照这条工作流依赖链执行。