dolphinscheduler简单任务定义及跨节点传参

dolphinscheduler简单任务定义及跨节点传参

首页角色扮演博文英雄传更新时间:2024-07-29
写在前面

dolphinscheduler是一款非常不错的调度工具,本文我就简称ds啦,可单机可集群可容器,可调度sql、存储过程、http、大数据,也可使用shell、python、java、flink等语言及工具,功能强大类型丰富,适合各类调度型任务,社区及项目也十分活跃,现在github中已有8.2k的star
所以,本篇博文开始会逐步讲一些ds相关的东西,也期待各位同行能接触到此并能实际解决一些生产上的问题~

一.准备工作

阅读本博文前建议您先阅读下官方的文档[https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/parameter/context.html)(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的连接地址,这点要明白~

二.简单的项目创建及说明

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

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

先简单到解释下ds的一点儿基本结构,首先,ds一般部署在linux服务器下,创建任务的用户需要在admin账户下创建,重要的是创建的每个工作账户需要与操作系统用户一一对应,比如你创建了一个 test 的ds账户,那ds所在的服务器也必须有一个test的账户才可行,这是ds的规则,我没法解释为什么。
每个用户下(除了admin外)所能创建的调度任务均在各自创建的项目下,每个项目又分为多个任务(工作流定义),一个任务下又可分为多个任务节点,下图为任务定义:


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

三.简单的参数传递

先看表:


我们先做个简单的,比如图中,如果二狗子的本名叫:李思,需要我们取id=1的name放到id=3的label中,并且更新update_time

四.复杂的跨节点传参

首先看表:


思考一个问题:可以看到李思的score是85,根据score应该被评为 B(>=90的为A)并写入到label字段,该怎么办呢,如果这个分数是90分又该怎么办呢,如果根本没有score(分值) 这个任务是不是就不需要更新李思的label(评分)呢?
对于上面问题可以有一些偏门的解决方法,比如在sql中塞一个异常值,这样看似不错,不过作为调度工具建议还是在condition节点或者switch节点处理是最好的,不过就目前我用的2.0.5版本的ds对于这两类任务节点是没法接收参数的,这是一个遗憾;遂~个人觉得较好的方式是在写入节点之前增加一个判断节点,将错误抛出(没有score的)最好~,对于此,我使用了一个shell的中间节点。
下面是我定义的三个节点:

(脚本内容)

#!/bin/bashecho "=====>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 1fi

五.中间的坑

对于复杂节点传参数也碰到一些坑,这些坑大概有这些:

文章来自https://www.cnblogs.com/funnyzpc/p/16395094.html

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved