作者简介

淡丹
数仓开发工程师
5年数仓开发经验,目前主要负责百得利MOBY新车业务
二手车业务及售后服务业务系统数仓建设
 

业务需求

在ETL任务之间调度时,我们有的时候会需要将上游的计算结果作为参数传入到下游,针对这种业务需求,海豚调度器为我们提供了一些功能。
 
具体如下:
DolphinScheduler允许在任务间进行参数传递,目前传递方向仅支持上游单向传递给下游。
支持这个特性的任务类型有:
  • Shell
  • SQL
当定义上游节点时,如果有需要将该节点的结果传递给有依赖关系的下游节点,需要在【当前节点设置】的【自定义参数】设置一个方向是 OUT 的变量。
目前我们主要针对 SQL 和 SHELL 节点做了可以向下传递参数的功能。

SQL任务

步骤1:SQL任务构建
 
测试SQL如下
select label_id,label_name  from (
select "10" as label_id,"客户" as label_name
) t
 
具体如下图

 
注意点
  1. 方向选择为 OUT,只有当方向为 OUT 时才会被定义为变量输出
  2. 数据类型可以根据需要选择不同数据结构
  3. Value 部分不需要填写
  4. 参数名字一定要和字段名字对应,否则不会识别
如果 SQL 节点的结果为多行,一个或多个字段,参数的名字需要和字段名称一致。
数据类型选择为LIST。获取到 SQL 查询结果后会将对应列转化为 LIST,并将该结果转化为 JSON 后作为对应变量的值。(注意新版本才会有,低版本没有LIST结构)
 
步骤2:SHELL脚本测试

注意此处,输入参数不需要填写,下游直接引用上游的变量即可
 
步骤3:上线验证结果
查看结果日志,可以看到下游节点已经接收到参数

 

SHELL任务

先看官网说明(链接):
https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html
 
  1. prop 为用户指定;
  2. 方向选择为 OUT,只有当方向为 OUT 时才会被定义为变量输出;
  3. 数据类型可以根据需要选择不同数据结构;
  4. value 部分不需要填写;
 
用户需要传递参数,在定义 shell 脚本时,需要输出格式为 ${setValue(key=value)} 的语句,key 为对应参数的 prop,value 为该参数的值。
 
例如下图

SHELL 节点定义的时候

日志检测到 ${setValue(key=value1)} 的格式时,会将 value1 赋值给 key,下游节点便可以直接使用变量 key 的值。
同样,您可以在【工作流实例】页面,找到对应的节点实例,便可以查看该变量的值。
 

 
但在实际使用中官网的例子是跑不通的,这里面有小坑,上述在使用 ${setValue(key=value)} 这种形式传参的时候必须用引号引起来。
 
如下才能成功
echo '${setValue(key=value)}'

  

案例所示

上线执行后查看日志如下:
 

可以看到结果已经打印出来。
如果取掉单引号会报如下错误:语法上就无法通过
 

所以在SHELL中传参的时候,根据给的固定语法前,必须得加上单引号,否则语法无法通过。
上述的例子也仅仅是 Key 后面跟的常量参数,事实上我们往往都是需要动态传参数的,所以 SHELL 的这种静态传递参数给下游其实是没有意义的,因为如果是静态的,我们为什么不选择in中输入参数呢?
 
如下图所示

我们在不同任务之间上下游之间的参数传递,往往是需要动态的/上游某个代码执行后的结果传递给下游。
 
我们不妨来试试这种方式是否可以?根据猜想我们编写如下案例:
 
任务1:

 
任务2:
 

 

 
查看test2的日志并未有任何执行结果打印出

 
根据上面的猜测,由于在使用的时候我们整体上加了单引号,又根据shell语法的经验,所以笔者决定在引用变量的时候再加单引号试试,也就是如下形式:
echo '${setValue(key='$value')}'

  

我们来继续实验:
value=`date`
echo $value
echo "-------------start-----------"
echo '${setValue(key='$value')}'
echo "-------------end----------------"

  

查看任务2的执行结果日志:
 

 
我们看到出现了最终想要的执行结果日志,也就是说想要动态传参必须采用如下模式才能成功~
 
echo '${setValue(key='$value')}'

  

注意:在海豚调度器在 3.0.0-beta-1 版本后修复了这一问题,可以更好的支持动态传参问题,比如动态地获取现有的本地或 HTTP 资源并获取设定变量
 
具体使用方法如下:
lines_num=$(wget https://raw.githubusercontent.com/apache/dolphinscheduler/dev/README.md -q -O - | wc -l | xargs)

echo "#{setValue(set_val_var=${lines_num})}"

  

 

 

总体传参串联任务案例

第一步:设置任务输出参数

 
第二步:获取第一步参数并打印输出,且继续传参

 
第三步:使用SQL语句获取第一步传递的参数 ,并把结果传递给下游。

 
引用参数时候,直接引用自定义输出参数的 Key 就可以了,比如本案例的 output ,一般采用${output}的形式,具体如下图所示:
 

第四步:获取第三步的执行结果参数,并将结果输出~
 

【注意点】如果是sql任务:sql结尾不要有分号(;)否则会报错。
 
整体流程如下图所示

查看最终(邮件结果)如下:
 

 
任务4日志信息:可以看到已生成结果信息
 

小结
本文总结了DophineSheduler上下游任务之间参数传递的方法,并对其中的易错点进行了梳理,同时给出了具体参数传递的案例,读者可自行进行摸索。
 
其中易错点归纳如下:
(1)参数输出时方向选择为 out
(2)sql任务时参数的 key 值一定和 sql 语句中的字段名保持一致,否则不识别
(3)输出的value值不需要填写
(4)shell任务时,具体参考如下模板,模板中注意引号的使用
echo '${setValue(key='$value')}'

  注意此处等号左边的 key 需要和自定义输出的参数key 名字一致

(5)sql任务中结尾不要有分号
(6)引用参数时只需要采用${key}即可
 
最后,如果对这个话题感兴趣的话,可以进群一起交流沟通,谢谢大家~
最后非常欢迎大家加入 DolphinScheduler 大家庭,融入开源世界!

我们鼓励任何形式的参与社区,最终成为 Committer 或 PPMC,如:
  • 将遇到的问题通过 GitHub 上 issue 的形式反馈出来。
  • 回答别人遇到的 issue 问题。
  • 帮助完善文档。
  • 帮助项目增加测试用例。
  • 为代码添加注释。
  • 提交修复 Bug 或者 Feature 的 PR。
  • 发表应用案例实践、调度流程分析或者与调度相关的技术文章。
  • 帮助推广 DolphinScheduler,参与技术大会或者 meetup 的分享等。
欢迎加入贡献的队伍,加入开源从提交第一个 PR 开始。
  • 比如添加代码注释或找到带有 ”easy to fix” 标记或一些非常简单的 issue(拼写错误等) 等等,先通过第一个简单的 PR 熟悉提交流程。
注:贡献不仅仅限于 PR 哈,对促进项目发展的都是贡献。
 
相信参与 DolphinScheduler,一定会让您从开源中受益!
 

参与贡献

 
随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。
 
参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:
贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。
 
社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689
非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22
如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html
来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。
 
来吧,开源社区非常期待您的参与。

DophineSheduler上下游任务之间动态传参案例及易错点总结的更多相关文章

  1. Postman 串行传参和动态传参详解

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...

  2. python记录_day10 动态传参 命名空间 作用域

    一.动态传参 动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名:**表示接收关键字参数,kwargs是参数名 def chi(*food): print(foo ...

  3. [Android] 配置build.gradle 动态传参

    (1)一个Android工程中有一个build.gradle是负责Project范围的,而Module中又有各自的build.gradle是专门负责模块的. (2)在Gradle中Task是一等公民, ...

  4. Postman高级应用——串行传参和动态传参详解

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...

  5. python-函数-动态传参,作用域的问题,函数嵌套,global nonlocal

    ⼀. 函数参数--动态传参 之前我们说过了传参, 如果我们需要给⼀个函数传参, ⽽参数⼜是不确定的. 或者我给⼀个 函数传很多参数, 我的形参就要写很多, 很⿇烦, 怎么办呢. 我们可以考虑使⽤动态参 ...

  6. 动态传参,命名空间,嵌套,gloabal,nonlocal

    一.动态传参 动态接受位置参数:  *参数名 def eat(*food): print(food) #多个参数传递进去,收到的内容是元祖tuple eat("盖浇饭", &quo ...

  7. js函数动态传参

    js函数体内可以通过arguments对象来接收传递进来的参数,利用这一对象属性可以动态传参. function box() { return arguments[0]+' | '+arguments ...

  8. uploadify的用法与动态传参 提供demo下载

    ---恢复内容开始--- 官网:http://www.uploadify.com/   一款不错的上传插件.官方文档http://www.uploadify.com/documentation/ 用法 ...

  9. python之路--动态传参,作用域,函数嵌套

    一 . 动态传参(重点)  * ,  ** * 与 ** * 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里 ...

随机推荐

  1. Linux修改CST时间为UTC时间。

    1.编辑配置文件添加如下内容 [root@Centos8-template ~]# vim /etc/sysconfig/clock ZONE="Etc/UTC" 2.生成链接 [ ...

  2. vue使用vuex报错 "export 'watch' was not found in 'vue'

    问题 安装Vuex后报错"export 'watch' was not found in 'vue' 解决方法 如果你的vue版本是 2.X ,将vuex升到 3.X.X 就能够解决 npm ...

  3. BI报表与数据开发

    先贴个不好看的图让内容好看一点,也顺便说一下数据处理的流程:收集数据,数据清洗与数据加工,数据展示 报表制作一般就是前面的开发兄弟们完成然后把数据交到报表的兄弟们,然后在根据领导要求制作报表.大概就是 ...

  4. Linux上安装java

    1,输入命令,查看是否已经安装了Openjdk:rpm -qa | grep java 如果有已经安装的java版本或者版本低于1.7,卸载该jdk:rpm -e 软件包名字 如果不能卸载,可以加上 ...

  5. Linux系列之进程管理

    前言 进程是正在运行的程序,Linux系统通常有数百个进程同时运行.本文就来介绍下Linux是如何进行进程管理的. 我们可以看到: 查看进程(Viewing processes) 查找进程(Findi ...

  6. MySQL源码解析之执行计划

    MySQL源码解析之执行计划 MySQL执行计划介绍 MySQL执行计划代码概览 MySQL执行计划总结 一.MySQL执行计划介绍 在MySQL中,执行计划的实现是基于JOIN和QEP_TAB这两个 ...

  7. 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!

    点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...

  8. Affinity broken due to vector space exhaustion 问题

    dmesg 中异常打印: kernel: irq 632: Affinity broken due to vector space exhaustion. kernel: irq 633: Affin ...

  9. 深入理解 Spring 事务:入门、使用、原理

    大家好,我是树哥. Spring 事务是复杂一致性业务必备的知识点,掌握好 Spring 事务可以让我们写出更好地代码.这篇文章我们将介绍 Spring 事务的诞生背景,从而让我们可以更清晰地了解 S ...

  10. 【HMS core】【FAQ】典型问题合集7

    ​1.[HMS core][Account Kit][问题描述] 集成华为帐号服务后,登录服务异常,无法获取用户信息,报statusCode为907135001,抓取报错日志:Failed to re ...