写点什么

Apache DolphinScheduler 简单任务定义及复杂的跨节点传参

  • 2022 年 8 月 30 日
    广东
  • 本文字数:3028 字

    阅读完需:约 10 分钟

点亮 ⭐️ Star · 照亮开源之路


GitHub:https://github.com/apache/dolphinscheduler



Apache DolphinScheduler 是一款非常不错的调度工具,可单机可集群可容 器,可调度 sql、存储过程、http、大数据等,也可使用 shell、python、java、flink 等语言及工具,功能强大类型丰富,适合各类调度型任务,社区及项目也十分活跃,现在 Github 中已有 8.5k 的 star👍

准备工作

阅读本文前建议您先阅读下官方的文档


文档链接:https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html


在这里,先准备下 sql 表资源,以下为postgresqlsql脚本:

表结构

CREATE TABLE dolphinscheduler.tmp (
id int4 NOT NULL,
"name" varchar(50) NULL,
"label" varchar(50) NULL,
update_time timestamp NULL,
score int4 NULL,
CONSTRAINT tmp_pkey PRIMARY KEY (id) );
复制代码

表数据

INSERT INTO tmp (id,"name","label",update_time,score) VALUES
(3,'二狗子','','2022-07-06 21:49:26.872',NULL),
(2,'马云云','',NULL,NULL),
(1,'李思','','2022-07-05 19:54:31.880',85);
复制代码


我这里使用的 postgresql 的数据库,如果您是 mysql 或者其他数据的用户,请自行更改以上表和数据并添加到库中即可~


表及数据入库,请将 tmp 所属的库配置到 DS 后台->数据源中心->创建数据源 ,以下是我的配置,记住,这里面的所有数据库配置均遵守所属数据库类型的 jdbc 的 driver 的配置参数,配置完成也会在 DS 的数据库生成一条 jdbc 的连接地址,这点要明白~

简单的项目创建及说明

因为 DolphinScheduler 的任务是配置在项目下面,所以第一步得新建一个项目,这样:DS后台->项目管理->创建项目,这是我创建的请看下图:



准备完项目之后,鼠标点进去,并进入到工作流定义菜单 页面,如下图:


简单解释下 DS 的基本结构

首先,DS 一般部署在 linux 服务器下,创建任务的用户需要在 admin 账户 下创建,重要的是创建的每个工作账户需要与操作系统用户一一对应.


比如你创建了一个 test 的 DS 账户,那所在的服务器也必须有一个 test 的账户才可行,这是 DS 的规则。


每个用户下(除了 admin 外)所能创建的调度任务均在各自创建的项目下,每个项目又分为多个任务(工作流定义),一个任务下又可分为多个任务节点。


下图为任务定义



ok,如果已经准备好以上步骤,下面开始继续定义一个简单的调度任务~

简单的参数传递

先看表:



如图我们先做个简单的:


如果二狗子的本名叫李思,需要取** id=1 的 name 放到 id=3 **的 label 中,并且更新 update_time

01

在工作流定义列表,点击 创建工作流 就进入一个具体的任务(工作流)的定义,同时我们使用的是 sql 任务,需要从左侧拖动一个 sql 任务到画布中(右侧空白处):



拖动 sql 任务 到画布会自动弹出节点定义,上图为当前节点的一个定义,重点是:数据源、sql 类型、sql 语句,如官方所说,如果将 name 传递到下游,则需要在自定义参数重定义这个 name 为 out 方向 类型为 varchar。

02

因为传递到参数需要写入到表,这里我们再定义一个节点,这个节点负责接收上游传递到 name,执行 update 时使用这个 name ,以下是我的定义:



这里不仅仅要注意 sql 类型 (sql 类型与 sql 语句是一一对应的,类型不能错) ,还有就是前置任务一定要选中(上面定义的) node1 节点。另外,需要注意的是当前任务是上下游传参,所以在 node2 中是直接使用 node1 中定义的 name 这个参数。

03

定义完成当前任务需要保存:点右上角保存,填写并保存后点关闭以退出定义;


04

定义的任务需要上线了才可执行,所以在工作流定义列表先点该任务的黄色按钮(任务上线),然后才是点绿色按钮(执行任务):

05

任务执行成功与否,具体得看任务实例,这是执行 node2 节点 的日志:



顺带再看看数据库表是否真实成功:



完美😊

复杂的跨节点传参

首先看表:



思考一个问题:可以看到李思的 score 是 85,根据 score 应该被评为 B(>=90 的为 A)并写入到 label 字段,该怎么办呢?如果这个分数是 90 分又该怎么办呢?如果根本没有 score(分值) 这个任务是不是就不需要更新李思的 label(评分)呢?


对于上面问题可以有一些偏门的解决方法,比如在 sql 中塞一个异常值,这样看似不错,不过作为调度工具建议还是在 condition 节点或者 switch 节点处理是最好的,目前我用的 2.0.5 版本对于这两类任务节点是没法接收参数的,这是一个遗憾;


个人觉得较好的方式是在写入节点之前增加一个判断节点,将错误抛出(没有 score 的)最好~,对于此,我使用了一个 shell 的中间节点。


下面是我定义的三个节点:


node1 节点定义:



node2 节点定义:



脚本内容


#!/bin/bash echo "=====>input param start<=====" echo "id=${id}" echo "score=${score}" echo "=====>input param end<=====" id=${id} echo '${setValue(id2='$id')}' if [ "${score}" -ge "90" ];then echo '${setValue(label2=level A)}' echo "level A" elif [ "${score}" -ge "80" ];then echo '${setValue(label2=level B)}' echo "level B" elif [ "${score}" -ge "60" ];then echo '${setValue(label2=level C)}' echo "level C" elif [ "${score}" -ge "0" ];then echo '${setValue(label2=F!)}' echo "F!" else echo "NO score ,please check!" exit 1 fi
复制代码


node3 节点定义:



看一眼结果🤓:


小结

1、对于 shell 脚本不熟悉的,判断节点其实还是有一些难度的,这是很重要的一点;


2、**node2(判断节点)不能有重复的参数,不管局部的还是 node1(上一级)**传递过来的,均不能重复;


3、因为在 node2(判断节点)需要将 id 以及 label 继续往下传(to node3),这时候就需要给 id 以及 label 定义一个映射的 out 变量(id2、label2);


3、node2 中重新设置参数麻烦,**需要在 shell 中重新定义变量(id2、label2),**同时需要在 shell 任务内使用拼接的方式赋值(如:echo '{setValue(id2='id')}');


4、sql 类型以及不同节点下不同参数时常搞错,不是任何节点都可以接收上级节点参数,以及局部变量与传递变量以及全局变量优先级区别及可能造成冲突;


5、DS 列表传参(2.0 是不可以的)很鸡肋,对于列表传参又不能在下一级节点做循环赋值,这点对于 DS 是有改进的空间的;


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"volunteer+wanted"


如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html


来吧,DolphinScheduler 开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。


参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区 Leonard-ds ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。


添加小助手时请说明想参与贡献。


来吧,开源社区非常期待您的参与。


< 🐬🐬 >

用户头像

分布式易扩展的可视化工作流任务调度平台 2022.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Apache DolphinScheduler 简单任务定义及复杂的跨节点传参_工作流调度_Apache DolphinScheduler_InfoQ写作社区