点亮 ⭐️ Star 照亮开源之路
GitHub:github.com/apache/dolp…
Apache DolphinScheduler是一款非常不错的调度东西,可单机可集群可容 器,可调度sql、存储过程、http、大数据等,也可运用shell、python、java、flink等语言及东西,功能强大类型丰厚,合适各类调度型使命,社区及项目也十分活跃,现在Github中已有8.5k的star
预备工作
阅读本文前主张您先阅读下官方的文档
文档链接:dolphinscheduler.apache.org/zh-cn/docs/…
在这儿,先预备下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 的衔接地址,这点要理解~
简略的项目创立及阐明
由于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用于熟悉提交的流程和社区协作以及感受社区的友好度。
社区汇总了以下合适新手的问题列表:github.com/apache/dolp…
非新手问题列表:github.com/apache/dolp…
如何参加奉献链接:dolphinscheduler.apache.org/zh-cn/commu…
来吧,DolphinScheduler开源社区需求您的参加,为我国开源兴起添砖加瓦吧,哪怕只是小小的一块瓦,会聚起来的力气也是巨大的。
参加开源能够近距离与各路高手商讨,敏捷提升自己的技术,假如您想参加奉献,咱们有个奉献者种子孵化群,能够增加社区Leonard-ds ,手把手教会您( 奉献者不分水平凹凸,有问必答,关键是有一颗愿意奉献的心 )。
增加小助手时请阐明想参加奉献。
来吧,开源社区非常期待您的参加。
< >