AirFlow高阶,两个启动时间不同DAG中的任务依赖关联demo

前言背景

笔者使用的是最新的airflow作为测试!版本为1.10.12,公司用的生产是比这个版本低了3个小版本,所以引入ExternalTaskMarker报错,如果有相似的小伙伴,可以自行搭建一个airflow,进行测试或者升级你的airflow。
有个调度需求,查询以前历史DAG发现,有一个DAG可以作为我新调度的前置,所以想看看DAG之间task如何关联,所以有了下面的Demo。
如果会科学上网,英语听力还不错的,可以移驾这里,这个大佬讲的会更到位!(点击我!!)

原理

DAG A和DAG B是两个不同py文件写的,我A中一个task是我B中一个task的依赖,只有当A执行完了,我的B才能执行,那么该如何做呢,那么就应该安排一个监工的,看着A中指定task是否执行成功,执行成功那就监工就可以撤了,让B中的那个任务开始执行。

Master.py

vim master.py

示例参考地址

from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
from airflow.sensors.external_task_sensor import ExternalTaskMarker, ExternalTaskSensor

default_args={
        "owner": "airflow",
        "start_date": datetime(2020,11, 22),
        }
with DAG(
dag_id="master_dag",
default_args=default_args,
schedule_interval="20 15 * * *",
#concurrency=1, 
#max_active_runs=1, 
tags=['example1'],
 ) as child_dag:
# [START howto_operator_external_task_sensor]
     child_task1 = ExternalTaskSensor(
     task_id="master_task1",
     external_dag_id="slave_dag",
     external_task_id="slave_task1",
    # timeout=600,
    # allowed_states=['success'],
    # failed_states=['failed', 'skipped'],
     execution_delta=timedelta(minutes=5),
    # mode= "reschedule",
     )

 # [END howto_operator_external_task_sensor]
     child_task2 = BashOperator(task_id="master_task2",bash_command="echo i am master!",dag=child_dag)
child_task1 >> child_task2

Slave.py

vim slave.py
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
from airflow.sensors.external_task_sensor import ExternalTaskMarker, ExternalTaskSensor
default_args={
        "owner": "airflow",
        "start_date": datetime(2020,11, 22),
        }
with DAG(
dag_id="slave_dag",
default_args=default_args,
schedule_interval="15 15 * * *",
#concurrency=1, 
#max_active_runs=1, 
tags=['example2'],
) as slave_dag:
 # [START howto_operator_external_task_marker]
    '''
    parent_task = ExternalTaskMarker(
     task_id="slave_task2",
     external_dag_id="master_dag",
     external_task_id="master_task1",
     execution_delta=timedelta(minutes=3)
      )
parent_task
'''
    slave_task = BashOperator(
    task_id ="slave_task1",
    bash_command ="echo i am slave!",
    )

slave_task

关系详解

这里master中的任务需要等待slave中的任务完成,所以需要有个监工来看着,那么这个监工有个官方提供组件ExternalTaskSensor来完成,所以需要引入依赖,
from airflow.sensors.external_task_sensor import ExternalTaskSensor,因为我的starttime不一直,所以在调度的时候,执行时间则需要用到timedelta,在sensor组建中,提供一个param 就是execution_delta,然后把timedelta传入即可,而传入值特别有讲究!!!我是试出来,毕竟英语太渣,听视频不是很明白。这传入的参数是2个DAG start_time差值的绝对值。我示例是master后5分钟启动,所以我这里填的是5。

原因是这样的,理想情况是,你master询问slave任务,slave任务还在running,所以sensor可以等待他完成,那么如果已经完成很久了,那么sensor问slave是不会给与回应的。
所以总结就是 execution_delta=timedelta(minutes=5)这个参数是填写到sensor中,他的值取决于两个DAG启动时间差!相应的参数可以传小时,分,秒。需要找到对应的API确认。

external_dag_id="slave_dag",
external_task_id="slave_task1",

sensor依靠这2个参数将slave的指定task进行监控的!

总结

官方也提供了一个特殊场景

如果希望每当parent_task上parent_dag被清除,child_task1
在child_dag特定execution_date还应该被清除,ExternalTaskMarker
应该使用。请注意,child_task1只有当用户清除时选择“递归”时,才会清除parent_task。

这个场景我没用到,所以不想去试了,有兴趣的,可以尝试下。
DAG中的Task关联,官方给予了对应sensor来监控,而且airflow还提供对于HTTP请求的状态的监控,总的来说是一款非常强大的调度工具,本人最近也在从AZKB转到AF,体验还不错,就是需要有一定的函数式编程经验或者有PY开发经验最佳,很多dag脚本是需要用py来进行编写,不过难度不是很大。等国内大佬有更好的总结,我也会加强学习,最近有个新调度框架海豚可实现拖拉拽进行调度。有空我会去尝试的。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Airflow 是一个基于 Python 的工作流管理系统,在处理复杂的工作流时,自动化的任务调度和任务流的管理是非常重要的。在 Airflow DAG(Directed Acyclic Graph)是一个非常重要的概念,它定义了工作流所有任务之间的依赖关系。在 Airflow DAG 的获取依赖是通过 `airflow.models.DAG` 类实现的。 在 DAG ,我们可以通过 `dependencies()` 方法获取 DAG依赖关系。这个方法返回的是一个列表,其包含了所有依赖任务。对于一个 DAG,可以从顶部任务开始递归地获取其所有的依赖关系。对于每一个任务节点,我们需要获取其输入和输出,根据 DAG 依赖关系,将所有输入任务的输出和自身输出加入到依赖列表。这个依赖的过程可以递归进行,直到所有的任务节点都处理完毕,得到整个 DAG依赖结构。 除了 `dependencies()` 方法,我们还可以通过 `subdag()` 方法获取 DAG 子图的依赖关系。一个 DAG 可以包含多个子图,每个子图都是一个 DAG,它包含了一组关联任务,这些任务可以被独立地调度和执行。通过调用父 DAG 的 `subdag()` 方法可以获得子 DAG,然后对子 DAG 进行依赖的处理,得到子 DAG依赖关系。 Airflow 对于 DAG依赖处理非常灵活,不仅支持序列依赖和并行依赖,还支持条件依赖和跳过依赖等特殊的依赖处理方式。这些依赖处理方式可以通过 DAG 的 `xcom_push()`、`set_downstream()`、`set_upstream()`、`set_following()`、`set_following_ids()` 等方法来实现。通过这些方法,我们可以非常灵活地构建复杂的 DAG,实现自 动化的任务调度和任务流的管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值