天天看点

Dataworks调度能力升级——分支节点

分支节点登场

在日常Dataworks的使用过程中,经常会有同学遇到如下的问题:我有一个节点,需要每个月的最后一天执行,应该如何设置?

这种情况我们一般的回复是:由于cron表达式无法表达这种场景,所以暂时无法支持。

但是,现在我们有了分支节点,它让我们可以套用switch-case的编程模型来搞定这个问题。下面有请分支节点和他的小兄弟们粉墨登场!!!

分支节点的兄弟们

现在打开“数据开发”页面,可以看到“控制节点”一栏多了几个新面孔,先来一张合影:

Dataworks调度能力升级——分支节点

他们分别是:

  1. 能把自己的结果传给下游的赋值节点 —— 赋值节点复用了节点 上下文依赖 的特性,在已有常量/变量两种上下文的基础上,赋值节点自带一种自定义的上下文输出。Dataworks会捕获赋值节点的select结果或者打印结果,把这个结果以outputs作为上下文输出参数的值供下游节点引用。
  2. 能决定哪些下游正常执行的分支节点 —— 分支节点复用了Dataworks上挂依赖的 输入输出 的特性,对于普通节点,节点的输出仅仅是一个全局唯一的字符串。当下游需要挂依赖时,搜索这个全局唯一的字符串作为节点的输入就能挂到下游节点列表中。但是对于分支节点,我们可以给每个输出关联一个条件,当下游挂依赖时可以选择性的把某一个条件关联的输出作为当前节点的输出。这样达到的效果时,在成为分支节点下游的同时,也关联到了分支节点的条件上:即满足了这个条件,这个输出对应的下游才会被正常执行;其他为满足条件的输出对应的下游会被置为空跑。
  3. 无论上游是否正常执行本身都会正常调度的归并节点 —— 对于未被分支节点选中的分支,Dataworks会把这个分支链路上所有的节点实例均置为空跑实例,也就是说一旦某个实例的上游有一个实例是空跑的话,它本身也会变为空跑。我们添加了归并节点来阻止这个空跑的属性无限制的传递下去,对于归并节点实例,无论它的上游有多少个空跑的实例它都会直接成功并且不会再把下游置为空跑。

下面这张图可以示意在有分支节点的情况下,依赖树会变成什么样

Dataworks调度能力升级——分支节点
  • ASN:一个赋值节点,它可以对比较复杂的情况做计算,为分支节点条件选择做准备
  • X/Y:分支节点,他们挂在赋值节点ASN下面,根据赋值节点的输出做分支的选择。如图,X 节点选择了左边的分支、Y节点选择了左边两个分支
    • A/C节点由于挂在了X/Y节点被选择的输出下面,因此正常执行
    • B节点虽然挂在了Y节点被选择的分支下面,但由于X节点未选择这个输出,因此B节点被置为空跑
    • E节点由于未被Y节点选中,因此即使有一个普通的Z节点上游,也同样被置为了空跑
    • G节点由于上游E节点空跑,因此即使C/F都正常执行,E节点同样把空跑
    • 至于空跑属性什么情况下才能不再向下传递呢?看JOIN节点,这是一个归并节点,它的特殊功能就是停止空跑属性的传递,可以看到由于D节点挂在了JOIN节点下面,因此B节点的空跑属性被阻断了,D开始正常跑了

好了分支节点的兄弟们已经介绍完毕,接下来看他们通力合作,解决某个节点只有每个月最后一天跑场景。

分支节点使用

Dataworks调度能力升级——分支节点

首先定义一组任务依赖:

  1. 根节点赋值节点来通过定时时间SKYNET_CYCTIME来计算当前是不是本月的最后一天,如果是则输出1,不是则输出0。这个输出会被Dataworks捕获,传递给下游。
  2. 分支节点通过赋值节点的输出来定义分支
  3. 两个shell节点挂在分支节点下面,分别执行不同的分支逻辑

定义赋值节点

赋值节点新建时会自带一个outputs,赋值节点的代码支持SQL/SHELL/PYTHON三种

  • 对于SQL类型,Dataworks捕获最后一条SELECT的SQL作为outputs的值
  • 对于SHELL/PYTHON类型,Dataworks捕获最后一行标准输出作为outputs的值

这里采用PYTHON类型作为赋值节点的代码,调度属性和代码如下:

代码

Dataworks调度能力升级——分支节点

调度属性

Dataworks调度能力升级——分支节点

定义分支

分支节点可以用简单的PYTHON语法的表达式定义条件,每个条件会绑定一个输出,意味着当满足这个条件时改输出下的下游节点会被执行起来,而其他的会被置为空跑。

调度配置

Dataworks调度能力升级——分支节点

分支配置

Dataworks调度能力升级——分支节点

再来看一遍调度配置

Dataworks调度能力升级——分支节点

挂在不同分支下面

最后,给真正执行任务的节点挂依赖的地方也要注意,可以看到分支节点已经有三个输出了,按照以往挂依赖的逻辑,把这三个输出中的任意一个当做输入即可;但是由于现在分支节点的输出关联了条件,所以要慎重选择。

每月最后一天执行的节点依赖

Dataworks调度能力升级——分支节点

每月其他时间执行的节点依赖

Dataworks调度能力升级——分支节点

Show Time

现在到了见证奇迹的时刻,发布之后,我们执行一下补数据,业务日期选择2018-12-30和2018-12-31,也就是定时时间分别为2018-12-31和2019-01-01,这样第一批补数据应该是会触发“最后一天”的逻辑,第二批触发“非最后一天”的逻辑,我们看看两者的区别。

业务日期2018-12-30(定时时间2018-12-31)

分支节点分支选择结果

Dataworks调度能力升级——分支节点

节点“最后一天执行”正常执行

Dataworks调度能力升级——分支节点

节点“除了最后一天之外运行”被置为空跑

Dataworks调度能力升级——分支节点

业务日期2018-12-31(定时时间2019-01-01)

Dataworks调度能力升级——分支节点

节点“最后一天执行”被置为空跑

Dataworks调度能力升级——分支节点

节点“除了最后一天之外运行”正常执行

Dataworks调度能力升级——分支节点

总结

好了,基于分支节点,我们已经实现了“每个月最后一天”执行的这一目标,当然这只是分支节点最简单的使用方法。基于赋值+分支,可以组合出各种各样的条件满足业务上的需求,期待大家一起发掘分支节点的能力。

最后,再回顾一下分支节点相关的要点:

  1. Dataworks捕获赋值节点的最后一条SELECT语句或者最后一行标准输出流作为赋值节点的输出供下游引用
  2. 分支节点的每一个输出都被关联了条件,下游挂分支节点作为上游,需要了解每个输出关联的条件的意义再选择
  3. 未被选中的分支会被置为空跑并且空跑属性会一直向下传递,直到遇到归并节点
  4. 归并节点除了阻断空跑属性外,还会有更多的超能力,一起期待吧!