DolphinScheduler周期依赖分析及自依赖设计思路

摘要:

DolphinScheduler已经支持了周期依赖,也就是当前任务可以依赖任何项目内流程的指定时间周期的指定任务结果,从某种意义上来讲也实现了自依赖。但是如果新建一个任务,这个时候任务自身还没有加入到流程中,那么就不能依赖自己了,只有新建好之后再次编辑才能依赖自己,如果我们不想要每次新建之后再次编辑,那咋办?
在完善自依赖之前先简单介绍一下周期依赖的实现:

周期依赖

名词解释
依赖周期

被依赖任务节点任务实例执行过的时间段

依赖关系

依赖节点之间的依赖关系,可以是与/或

依赖关系组

一个依赖关系组中可能存在一个或多个同类型关系流程任务依赖,比如说一个依赖关系组中可以有一个/多个与关系依赖

依赖关系组列表

多个不同依赖关系组最终组成了一个依赖关系列表,他们之间有一个最终的关系是与/或

图示

DS依赖原图

DS原流程依赖介绍
  1. 依赖于选定项目已有流程(包括自身)的已有任务节点;
  2. 可以依赖多个流程任务实例结果;
  3. 可以选定任务实例周期;
  4. 以流程依赖关系( 与/或 )对流程进行分组,一个组可以有一个或多个任务;
  5. 所有的依赖关系组最后是与关系还是或关系。
执行过程说明

work执行任务时通过TaskManager获取到任务类型为依赖类型的任务,会先判断任务状态是否正常。任务状态正常就会获取他的依赖结果,根据依赖结果判断当前这个依赖类型任务的执行结果状态。获取该任务的依赖结果需要先获取到每个依赖关系组的结果,然后进行一个与/或的关系运算得出依赖关系列表结果,依赖关系列表的结果即为该任务依赖的最终结果。每个依赖关系组的结果由组内流程任务依赖结果和依赖关系计算得出。

举例:
问题描述

A任务依赖了一个依赖关系类表;
依赖关系列表里面包括了两个依赖关系组1、2,组1和组2是一个与关系;
组1里面有3个与关系的任务,昨天早上9点任务a,昨天10点任务b,今天10点任务c,
任务a来自流程一,任务b来自流程二,任务c来自流程三;
组2里面是或关系,包括自依赖和今天10点任务c;
那么怎样才算A依赖任务运行成功呢?

解答

因为组1组2是与关系,所以要求组1组2的结果全部都是成功的;
要求组1全部成功,组1是与关系,那么必须流程一在昨天早上9点内的最后一个任务a的实例是运行成功的,
流程二在昨天早上10点内的最后一个任务b的实例是运行成功的,
流程三在今天10点内的最后一个任务c的实例是运行成功的;
要求组2成功,需要当前A任务所属的流程上一次运行是成功的或者流程三在今天10点内的最后一个任务c的实例是运行成功的。自依赖成功不包括不数据运行这种方式,重跑的流程实例计入重跑前那次;
满足以上的条件A任务就跑成功了,如果没有特殊异常,就会更新数据库状态为成功。

自依赖设计

明白了周期依赖,自依赖改造其实很简单了。

流程图

DS自依赖设计流程图

实现思路

只需要前端保存依赖关系时新增一个自依赖字段,用于遍历依赖关系组时,判断是否自依赖,是自依赖的话首先需要判断依赖的任务所在流程是否执行过,如果没有执行过证明是首次执行,那么直接认为自依赖结果成功,如果已经执行过,则需要所选周期中存在被依赖任务实例,并且结果成功,才算自依赖成功。

核心代码修改部分
org.apache.dolphinscheduler.server.utils.DependentExecute#calculateResultForTasks
private DependResult calculateResultForTasks(DependentItem dependentItem,
                                                 List<DateInterval> dateIntervals) {

        DependResult result = DependResult.FAILED;
        for(DateInterval dateInterval : dateIntervals){
            if(DependType.SLEF.getCode() == dependentItem.getSelfDepend()) {
                //todo 获取自依赖流程结果
                ...
            } else {
                // 获取原周期依赖结果
                ...
            }
            
        }
        return result;
    }

接下来只要填代码就可以实现完整的自依赖啦!

Apache DolphinScheduler是一个新一代分布式大数据工作流任务调度系统,致力于“解决大数据任务之间错综复杂的依赖关系,整个数据处理开箱即用”。它以 DAG(有向无环图) 的方式将任务连接起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及 Kill任务等操作。目前已经有像IBM、腾讯、美团、360等400多家公司生产上使用。 调度系统现在市面上的调度系统那么多,比如老牌的Airflow, Oozie,Kettle,xxl-job ,Spring Batch等等, 为什么要选DolphinSchedulerDolphinScheduler 的定位是大数据工作流调度。通过把大数据和工作流做了重点标注. 从而可以知道DolphinScheduler的定位是针对于大数据体系。DolphinScheduler 发展很快 很多公司调度都切换到了DolphinScheduler,掌握DolphinScheduler调度使用势在必行,抓住新技术机遇,为跳巢涨薪做好准备。 优秀的框架都是有大师级别的人写出来的,包含了很多设计思想和技术。DolphinScheduler也不例外,它是一个非常优秀的框架,用到很多技术和设计思想,本课程会带大家深入DolphinScheduler框架源码,包括设计的思想和技术都会讲解,DolphinScheduler源码很多,会按照模块进行讲解,学习完课程后,不仅可以熟悉DolphinScheduler使用,而且可以掌握很多优秀的设计思想和技术,给自己的技术带来很大提升,为跳巢涨薪做好准备。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游语

对你有帮助,可以请我喝杯奶哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值