本文将为您介绍分支节点如何实现在特定时间执行任务。

分支节点产生背景

在日常DataWorks的使用过程中,如果您有一个节点,需要每个月的最后一天执行,可以进行如下设置。

分支节点出现前,由于Cron表达式无法实现该场景,所以暂时无法支持。

现在,DataWorks已经正式支持分支节点。利用分支节点,您可以套用switch-case编程模型实现上述需求。

分支节点与其他控制节点

数据开发页面,您可以看到当前版本的DataWorks支持的各种控制节点,包括赋值、分支、归并节点等。

各类型控制节点的作用如下:

  • 赋值节点:可以把自己的结果传给下游。

    赋值节点复用了节点上下文依赖的特性,在已有常量/变量两种节点上下文的基础上,赋值节点自带一种自定义的上下文输出。DataWorks会捕获或打印赋值节点的select结果,并将该结果以outputs形式作为上下文输出参数的值,供下游节点引用。

  • 分支节点:可以决定哪些下游正常执行。

    分支节点复用了DataWorks上依赖关系设置的输入输出的特性。

    对于普通节点,节点的输出仅仅是一个全局唯一的字符串。当下游需要设置依赖时,搜索这个全局唯一的字符串作为节点的输入就能挂到下游节点列表中。

    但是,对于分支节点您可以给每个输出关联一个条件:

    当下游设置依赖时可以选择性的把某一个条件关联的输出作为分支节点的输出。这样,节点在成为分支节点下游的同时,也关联到了分支节点的条件上:

    • 满足该条件,该输出对应的下游才会被正常执行。
    • 其他未满足条件的输出对应的下游节点,会被置为空跑。
  • 归并节点:无论上游是否正常执行,本身都会正常调度。

    对于未被分支节点选中的分支,DataWorks会把这个分支链路上所有的节点实例均置为空跑实例,也就是说一旦某个实例的上游有一个实例是空跑的话,它本身也会变为空跑。

    DataWorks当前可以通过归并节点来阻止这个空跑的属性无限制的传递下去:对于归并节点实例,无论它的上游有多少个空跑的实例,它都会直接成功并且不会再把下游置为空跑。

您可以从下图看到在有分支节点的情况下,依赖树的逻辑关系。
逻辑关系
  • ASN:一个赋值节点,用于对比较复杂的情况做计算,为分支节点条件选择做准备。
  • X/Y:分支节点,他们处于赋值节点ASN下游,根据赋值节点的输出做分支的选择。如图中绿色线条所示,X节点选择了左边的分支,Y节点选择了左边两个分支:
    • A/C节点由于处于了X/Y节点被选择的输出下游,因此正常执行。
    • B节点虽然处于Y节点被选择的分支下游,但由于X节点未选择这个输出,因此B节点被置为空跑。
    • E节点由于未被Y节点选中,因此即使有一个普通的Z节点上游,也同样被置为了空跑。
    • G节点由于上游E节点空跑,因此即使C/F都正常执行,G节点同样空跑。
    • 空跑属性什么情况下才能不再向下传递?

      JOIN节点是一个归并节点,它的特殊功能就是停止空跑属性的传递,可以看到由于D节点处于JOIN节点下游,因此B节点的空跑属性被阻断了,D节点可以开始正常跑了。

您可以通过利用分支节点配合其他控制节点,满足某个节点只有每个月最后一天运行的需求场景。

使用分支节点

定义任务依赖

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

定义赋值节点

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

  • 对于SQL类型,DataWorks捕获最后一条SELECT语句作为outputs的值。
  • 对于SHELL/Python类型,DataWorks捕获最后一行标准输出作为outputs的值。

本文采用Python类型作为赋值节点的代码,调度属性和代码设置如下。

  • 代码设置
    代码设置
  • 调度属性配置
    调度属性

定义分支

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

  • 调度配置
    调度配置
  • 分支配置
    分支配置
  • 调度配置生成条件绑定的输出
    输出

将执行任务节点挂在不同分支下

最后,给真正执行任务的节点设置依赖时需要注意:您可以看到分支节点已经有三个输出了,按照过去设置依赖的逻辑,把这三个输出中的任意一个当做输入即可。由于现在分支节点的输出关联了条件,所以要慎重选择。

  • 每月最后一天执行的节点依赖
    节点依赖
  • 每月其他时间执行的节点依赖
    节点依赖

结果验证

完成上述所有配置后,您可以提交并发布任务。完成发布后,可以执行补数据来测试效果:业务日期选择2018-12-30和2018-12-31,也就是定时时间分别为2018-12-31和2019-01-01,这样第一批补数据会触发最后一天的逻辑,第二批触发非最后一天的逻辑。两者的区别如下所示。

业务日期2018-12-30(定时时间2018-12-31)
  • 分支节点分支选择结果
    选择结果
  • 节点(最后一天执行)正常执行
    正常执行
  • 节点(除了最后一天之外运行)被置为空跑
    空跑
业务日期2018-12-31(定时时间2019-01-01)
  • 分支节点分支选择结果
    选择结果
  • 节点(最后一天执行)被置为空跑
    空跑
  • 节点(除了最后一天之外运行)正常执行
    正常执行

总结

基于分支节点,您已经实现了每个月最后一天执行的这一目标,当然这只是分支节点最简单的使用方法。将赋值节点与分支节点配合使用,您可以组合出各种各样的条件满足业务上的需求。

最后回顾分支节点使用要点:

  • DataWorks捕获赋值节点的最后一条SELECT语句或者最后一行标准输出流,作为赋值节点的输出,供下游引用。
  • 分支节点的每一个输出都被关联了条件,下游挂分支节点作为上游,需要了解每个输出关联的条件的意义再选择。
  • 未被选中的分支会被置为空跑,并且空跑属性会一直向下传递,直到遇到归并节点。
  • 归并节点除了阻断空跑属性外,还有更多更强大的功能等待您的挖掘。