作者简介

淡丹
数仓开发工程师
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系统下安装windows字体笔记

    源文档地址:https://www.e-iceblue.cn/spiredocforjavaconversion/word-to-pdf-font-issue.html windows字体路径:C:\ ...

  2. Odoo 14 Action URL 生成

    from werkzeug.urls import url_encode url = '/web#%s' % url_encode({ 'action': 'hr.plan_wizard_action ...

  3. 数据分表Mybatis Plus动态表名最优方案的探索

    一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...

  4. LuoguP4219 [BJOI2014]大融合(LCT)

    早上考试想用\(LCT\)维护联通块\(size\),现在才发现\(LCT\)的\(size\)有虚实之分 \(Link\)与\(Acess\)中虚实变,干他丫的 \(Splay\)中只是相对关系,没 ...

  5. Git 使用技巧(一):合并分支

    在合并分支之前最好保证你所有的分支都是最新的,所以你可以使用 git pull origin branchName 来拉取远程仓库到本地仓库. 假如有一个 dev 分支需要合并到 master 分支中 ...

  6. 算法模板:dijkstra

    #include<iostream> #include<algorithm> #include<cstring> #include<string> #i ...

  7. 字符串KMP——用途广泛的字符串匹配算法 + 扩展KMP——特殊定义的字符串匹配

    引 入 引入 引入 " SY 和 WYX 在看毛片.(几 毛 钱买到的动作 片,毛 片) WYX 突然想回味一个片段,但是只记得台词里面有一句挺长的 " ∗ ∗ ∗ ∗ **** ...

  8. C#基础_变量的命名规则

    变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型    变量名=赋值: 3.常用的数据类型:  int   整数类型  取值范围:最大2147483647;最小-214748364 ...

  9. identity4 系列————持久化配置篇[五]

    前言 上面已经介绍了3个例子了,并且介绍了如何去使用identity. 但是在前面的例子中,我们使用的都是在内存中操作,那么正式上线可能需要持久到数据库中. 这里值得说明的是,并不一定一定要持久化到数 ...

  10. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...