示例讲解 | Apache DolphinScheduler 简单任务定义及复杂的跨节点传参

67c7bedc30b7cba9bbda0250ae20fbdf.gif 点亮 ⭐️ Star · 照亮开源之路

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

5413098cd44a81ce505b3b5068d880f8.jpeg

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


本篇博文前面会讲一些DolphinScheduler相关的东西,也期待各位同行能接触到此并能实际解决一些生产上的问题~😁

1 准备工作

DS

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

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


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

表结构


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 的连接地址,这点要明白~

829e92b19b968f2187cf150c5f615be9.png

2 简单的项目创建及说明

DS

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

2ff1ad11b32825b341365535f9efb072.png

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

340a11a18c34f0029b15f85c8d1828de.png

简单解释下DS的基本结构

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

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

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

下图为任务定义

f0ecf20639b09f78fc43832da6d874d6.png

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

3 简单的参数传递

DS

先看表:

47bfa71c357bd163c6d8c87781095682.png

如图我们先做个简单的:

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

01

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

36176dfeba281095fa4c9546a4dca1be.png

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

02

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

76fe5ccf3b7e69361eab533d75c9f266.png

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

03

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

f16233e0499744d1ccaef5dc12f2d83b.png

04

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

05

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

52623f4c167b826c1cdf8ed65a6626f3.png

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

6b7ee3f28253412ecab831b6de57caca.png

完美😊

4 复杂的跨节点传参

DS

首先看表:

c94d38614e789d1a48e3bbf423d86c81.png

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

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

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

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

node1节点定义:

68d93d3e4ce33e2378c772b224f4f578.png

node2节点定义:

b37edb68033705de80da065edb134acf.png

脚本内容

#!/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节点定义:

d7273e4df617292b745cf96e1e199f88.png

看一眼结果🤓:

46f62761b823bc1b5abadc925aaf9205.png

5 小结

DS

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 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

欢迎关注作者公众号

0064bb034275304fa9da8ac1a56440e3.png

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

44ab7870bdf66747cf954c60a01430f3.png

贡献第一个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开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

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

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

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

< 🐬🐬 >

更多精彩推荐

☞ApacheCon Asia 2022 精彩回顾 | DolphinScheduler 在 T3 出行一站式平台中的应用

☞ApacheDolphinScheduler 整合大数据生态安全门 Apache Knox,统一对外服务

☞ApacheCon Asia 2022 精彩回顾 | DolphinScheduler 在联想作为统一调度中心的落地实践

☞名额已排到10月 | Apache DolphinScheduler Meetup分享嘉宾继续火热招募中

小海豚“变身”全新智能调度引擎,深入浅出在DDS的实践开发应用

☞对话 Contributor| 中国团队贡献的开源项目, 当然要支持

自动更新选股模型,实时监控,基于 Apache DolphinSchedule 打造机器学习智能选股系统

开源大数据 Studio 应用开发: Apache Dolphinscheduler + Notebook

我知道你在看f7894d213501a822ad33c9a75b60934e.png

### 关于 Apache DolphinScheduler 中 UDF 的使用 在 Apache DolphinScheduler 中,用户定义函数 (User Defined Function, UDF) 主要用于扩展 SQL 任务的功能。通过编写自定义逻辑并将其注册到系统中,可以在执行 SQL 查询时调用这些函数来处理数据。 #### 注册 UDF 函数 为了能够在 SQL 脚本里使用 UDF,首先需要将编写的 Java 或 Scala 形式的类打包成 JAR 文件,并上传至 DolphinScheduler 平台。具体操作是在 Web UI 上找到对应的资源中心位置完成上传动作[^3]。 #### 创建和配置 SQL 任务以支持 UDF 当创建一个新的 SQL 类型的任务节点时,在高级选项卡内提供了一个字段用来填写额外的依赖关系——即之前提到过的包含 UDF 实现的 jar 包路径。这样做的目的是为了让运行环境能够识别并加载所需的外部库文件。 ```sql -- 假设有一个名为 my_udf.jar 的包已经成功上传到了资源管理器下 SET CLASSPATH=classpath:/my_udf.jar; SELECT MY_CUSTOM_FUNCTION(column_name) FROM table_name; ``` 上述代码片段展示了如何在一个标准 SELECT 语句前声明所使用的 UDF 所处的位置以及怎样实际应用该功能。 #### 示例:实现简单的字符串拼接 UDF 下面给出一个非常基础的例子说明如果开发一个简单实用的小工具作为 UDF: 假设需求是要构建一个能接收两个输入参数并将它们连接起来形成新串输出的方法,则可以用如下方式编码(这里采用的是伪代码形式展示概念): ```java // MyStringConcat.java public class MyStringConcat { public static String concat(String str1, String str2){ return str1 + " " + str2; } } ``` 之后按照前述流程把此段程序封装好后部署给 DolphinScheduler 使用即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值