DophineSheduler上下游任务之间动态传参案例及易错点总结


DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
? 作者简介
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
?淡丹 数仓开发工程师5年数仓开发经验,目前主要负责百得利MOBY新车业务二手车业务及售后服务业务系统数仓建设 业务需求在ETL任务之间调度时,我们有的时候会需要将上游的计算结果作为参数传入到下游,针对这种业务需求,海豚调度器为我们提供了一些功能 。 具体如下:DolphinScheduler允许在任务间进行参数传递,目前传递方向仅支持上游单向传递给下游 。支持这个特性的任务类型有:
  • Shell
  • SQL
当定义上游节点时,如果有需要将该节点的结果传递给有依赖关系的下游节点,需要在【当前节点设置】的【自定义参数】设置一个方向是 OUT 的变量 。目前我们主要针对 SQL 和 SHELL 节点做了可以向下传递参数的功能 。SQL任务步骤1:SQL任务构建 测试SQL如下select label_id,label_namefrom (select "10" as label_id,"客户" as label_name) t 具体如下图
DophineSheduler上下游任务之间动态传参案例及易错点总结

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

文章插图
?注意此处,输入参数不需要填写,下游直接引用上游的变量即可 步骤3:上线验证结果查看结果日志,可以看到下游节点已经接收到参数
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
? 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 为该参数的值 。 例如下图
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
?SHELL 节点定义的时候日志检测到 ${setValue(key=value1)} 的格式时,会将 value1 赋值给 key,下游节点便可以直接使用变量 key 的值 。同样,您可以在【工作流实例】页面,找到对应的节点实例,便可以查看该变量的值 。 
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
? 但在实际使用中官网的例子是跑不通的,这里面有小坑,上述在使用 ${setValue(key=value)} 这种形式传参的时候必须用引号引起来 。 如下才能成功echo '${setValue(key=value)}'
案例所示
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
?上线执行后查看日志如下: 
DophineSheduler上下游任务之间动态传参案例及易错点总结

文章插图
?可以看到结果已经打印出来 。如果取掉单引号会报如下错误:语法上就无法通过 。 
DophineSheduler上下游任务之间动态传参案例及易错点总结

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

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

文章插图
? 任务2: 

推荐阅读