如何用 Apache DolphinScheduler 实现自动配置自定义变量?

news2024/10/6 8:26:36

file 作者 | sqlboy-yuzhenc

背景介绍

在实际工作应用中,我们可能需要在整个 Apache DolphinScheduler 层面定义共用的日期变量,但是,开源版 Apache DolphinScheduler 只允许配置工作流级别的全局变量,这样,每个工作流就得配置相同的变量,操作起来重复并且麻烦。通过这篇文章,只需要将海豚调度级别的变量插入到变量表中,就会在保存工作流的时候将变量表中的变量自动配置。

原理

在工作流定义表(t_ds_process_definition)上定义一个事前触发器,在更新或插入数据之前,触发器会将t_ds_process_definition.global_params 的值替换为用户在工作流保存界面上配置的全局变量与在变量定义表中定义的变量的并集。

tool模式操作

创建自定义枚举类型

create type vartype as enum ('INTEGER','VARCHAR','LONG','FLOAT','DOUBLE','DATE','TIME','TIMESTAMP','BOOLEAN','LIST');
create type vardirect as enum ('IN','OUT');

创建变量定义表

drop table if exists prop_def cascade;
create table prop_def (
     prop varchar(63) primary key  --参数名 
    ,prop_def text  --参数定义
    ,prop_def_dp text  --对应的海豚的定义
    ,prop_desc text  --参数描述
    ,prop_direct vardirect default 'IN'  --参数类型  IN或out
    ,prop_type vartype default 'VARCHAR'  --参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST
    ,prop_create_time timestamp default current_timestamp  --变量创建时间
);
comment on table prop_def is '参数定义表';
comment on column prop_def.prop is '参数名';
comment on column prop_def.prop_def is '参数定义';
comment on column prop_def.prop_def_dp is '对应的海豚的参数定义';
comment on column prop_def.prop_direct is '参数类型  IN或out';
comment on column prop_def.prop_type is '参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST';
comment on column prop_def.prop_desc is '参数描述';
comment on column prop_def.prop_create_time is '参数创建时间';

插入变量定义

insert into prop_def(
     prop  --参数名
    ,prop_def  --参数定义
    ,prop_def_dp  --对应的海豚的定义
    ,prop_desc  --参数描述
) values 
 ('today',$$to_char(current_date,'yyyymmdd')$$,$$$[yyyyMMdd]$$,'今天')
,('yesterday',$$to_char(current_date-1,'yyyymmdd')$$,$$$[yyyyMMdd-1]$$,'昨天')
,('tomorrow',$$to_char(current_date+1,'yyyymmdd')$$,$$$[yyyyMMdd+1]$$,'明天')
,('thismonth',$$to_char(current_date,'yyyymm')$$,$$$[yyyyMM]$$,'本月')
,('lastmonth',$$to_char(to_date(to_char(current_date,'yyyymm')||'01','yyyymmdd')-1,'yyyymm')$$,$$$[add_months(yyyyMM,-1)]$$,'上月')
,('nextmonth',$$(to_char(current_date,'yyyymm')::numeric+1)::varchar$$,$$$[add_months(yyyyMM,1)]$$,'下月')
,('thisyear',$$to_char(current_date,'yyyy')$$,$$$[yyyy]$$,'本年')
,('nextyear',$$(to_char(current_date,'yyyy')::int+1)::varchar$$,$$$[add_months(yyyy, 12*1)]$$,'明年')
,('lastyear',$$(to_char(current_date,'yyyy')::int-1)::varchar$$,$$$[add_months(yyyy, -12*1)]$$,'去年')
;

创建获取变量值函数

create or replace function get_propdef(propdef_sql varchar) 
 returns varchar
 language plpgsql
as $function$ 
/*
 * 作者:v-yuzhenc
 * 功能:返回指定变量定义具体实时的值
 * propdef_sql:变量定义sql
 * */
declare 
    p_result varchar;
    p_propdef_sql varchar;
begin
    execute 'select '||propdef_sql into p_result;
       return p_result;
    exception when others then 
        return p_result;
end;
$function$
;
grant execute on function get_propdef(varchar) to public;

创建实时变量值视图

create or replace view v_prop_def as
select 
     current_timestamp as currenttime  --当前时间
    ,prop  --参数名
    ,prop_def  --参数定义
    ,prop_def_dp  --对应的海豚的定义
    ,get_propdef(prop_def) as prop_value  --当前时间的参数值
    ,prop_desc  --参数描述
    ,prop_direct  --参数类型  IN或out
    ,prop_type  --参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST
from prop_def
;
comment on view v_prop_def is '实时变量表';
comment on column v_prop_def.currenttime is '当前时间';
comment on column v_prop_def.prop is '参数名';
comment on column v_prop_def.prop_def is '参数定义';
comment on column v_prop_def.prop_def_dp is '对应的海豚的定义';
comment on column v_prop_def.prop_value is '当前时间的参数值';
comment on column v_prop_def.prop_desc is '参数描述';
comment on column v_prop_def.prop_direct is '参数类型  IN或out';
comment on column v_prop_def.prop_type is '参数类型 VARCHAR INTEGER LONG FLOAT DOUBLE DATE TIME TIMESTAMP BOOLEAN LIST';

dp模式操作

创建触发器函数

create or replace function tg_ds_udef_prop_def()
returns trigger 
as $trigger$
/*
 * 作者:v-yuzhenc
 * 功能:海豚调度自动配置替代变量
 * */
begin
    select (('['||string_agg($${"prop":"$$||prop||$$","value":"$$||value||$$","direct":"$$||direct||$$","type":"$$||type||$$"}$$,',')||']')::json)::text
    into new.global_params
    from (
        select 
             coalesce(a.prop,b.prop) prop
            ,coalesce(a.prop_def_dp,b.value) value
            ,coalesce(a.prop_direct::varchar,b.direct) direct
            ,coalesce(a.prop_type::varchar,b.type) type
        from tool.prop_def a 
        full join (
            select 
                 json_array_elements(new.global_params::json) ->> 'prop' as prop
                ,json_array_elements(new.global_params::json) ->> 'value' as value
                ,json_array_elements(new.global_params::json) ->> 'direct' as direct
                ,json_array_elements(new.global_params::json) ->> 'type' as type
        ) b 
        on (a.prop = b.prop)
    ) a
    ;
    return new;
end;
$trigger$
language plpgsql;
  • 注:这里的tool和dp是pg的模式,我海豚调度的元数据存储在dp模式下,但是变量定义表存储在tool下,所以在函数中访问变量定义表时加了tool.(即tool.prop_def),请根据自己实际情况修改。

    创建触发器

  • 这里创建事前触发器,在更改或者新增一个工作流之前,将变量的定义给到全局参数定义字段
    create trigger tg_prop_ds_process_definition before update or insert on t_ds_process_definition for each row execute procedure tg_ds_udef_prop_def();

测试

查询实时变量值视图

select * from v_prop_def;

file

工作流测试

  • 创建工作流,选择shell插件
    echo ${today}
    echo ${yesterday}
    echo ${tomorrow}
    echo ${thismonth}
    echo ${lastmonth}
    echo ${nextmonth}
    echo ${thisyear}
    echo ${nextyear}
    echo ${lastyear}

file

  • 点击保存

file

  • 上线工作流,点击运行工作流,界面就能看出变量已经自动配置上

file

  • 运行完毕,查看shell任务日志

file

  • 下线工作流,点击编辑工作流,点击保存,可以看到变量是已经自动定义

file

本文转载自CSDN博主sqlboy-yuzhenc文章:https://blog.csdn.net/qq_33445829/article/details/131331848

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记之优化算法(九)收敛速度的简单认识

机器学习笔记之优化算法——收敛速度的简单认识 引言收敛速度的判别标准 Q \mathcal Q Q-收敛速度 R \mathcal R R-收敛速度关于算法复杂度与收敛速度 引言 本节对收敛速度简单介绍。 收敛速度的判别标准 我们之前几节介绍了线搜索方法 ( Line Search Method ) (\text{Line …

无人驾驶实战-第四课(动态环境感知与2D检测算法)

无人驾驶中的检测框架 2D目标检测的思路 位置:先找到所有的ROI (Region of Interest, bounding box may containing object)类别:对每一个ROI做分类获取类别信息 位置修正:Bounding box Regression 找寻ROI的方法 1.滑窗法。从左到右&#xf…

Ansys Zemax | 大功率激光系统的 STOP 分析 (三)

大功率激光器广泛用于各种领域当中,例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应,将导致在光学系统中由于激光能量吸收所产生的影响也显而易见,大功率激光器系统带来的激光能量加热会降低此类光学系统的…

Java中的内存划分,一个数组的内存图,两个数组的内存图,两个引用指向同一个数组的内存图

1、Java中的内存划分 Java的内存需要分成5个部分: 栈(Stack) 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量:方法的参数,或者是方法{}内部的变量 作用域:一旦超出作用域&#…

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称,更改网卡eth1的跃点数(metric值)为0(数值越小&#xf…

存放数据的方式:Java集合框架

文章目录 1. 目前存放数据的方式2. Java集合框架3. Collection接口常用方法解析public boolean add(E e)public void clear()public boolean remove(E e)public boolean contains(E e)public boolean isEmpty()public int size()public Object[] toArray() 4. 迭代器5. 增强for…

从零基础开始开发自己的第一个微信小程序

文章目录 内容介绍小程序开发步骤注册微信小程序账号下载开发工具搭建开发环境创建工程编写代码手机上查看效果 工程里的文件作用介绍总结 内容介绍 通过本篇blog,你可以熟悉从零开始,搭建小程序开发环境,并运行起自己的第一个小程序。 小程…

Stability AI旗舰图像模型 SDXL1.0发布,AI绘画进入新的时代

Stability AI于7月26号开源了SDXL1.0文生图模型,要知道距离SDXL0.9开源发布也不过一个月,只能说AI发展日新月异。 根据官网介绍,SDXL1.0经过迭代更新,已经是目前世界上最好的图像生成模型 官网根据Discord上的几代实验模型和外部测试&#…

股票量价关系分析

量增价平 量增价平是指成交量增加,股价保持相对平稳的量价关系模型,量的增加可以是资金大量流入引起,也可以是资金大量流出引起,因此这种关系模型需要根据股价所处的位置来具体分析。1、股价处于低位 当股价处于低位,此…

Unity之webgl端通过vue3接入腾讯云联络中心SDK

腾讯云联络中心SDK:云联络中心 Web-SDK 开发指南-文档中心-腾讯云 (tencent.com) 1 首先下载Demo ​ 1.1 对其进行解压 ​ 1.2根据文档操作 查看README.md,根据说明设置server下的dev.js里的相关参数。 然后打开电脑终端,cd到项目的路径: ​ 安装…

喜报 | 《中国AIOps现状调查报告(2023)》发布!擎创科技案例再度入选

(本文部分内容来自《中国AIOps现状调查报告(2023)》,丝小编扣1,领取完整版报告) 2023年7月18日,信通院Xops产业创新发展论坛于北京成功举办。大会旨在提高企业研发运营水平,加强XOp…

243. 一个简单的整数问题2(树状数组)

输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4输出样例: 4 55 9 15 解析: 一般树状数组都是单点修改、区间查询或者单点查询、区间修改。这道题都是区间操作。 1. 区间修改用数组数组维护差分数组 2. 区间查询&am…

实现弧形切角两种方式

1、css 的 radial-gradient <view style"padding:30px; background: #ccc;"><view class"navActive"></view> </view>.navActive{width: 200px;height: 40px;background-color: #fff;color: rgb(0,63,136);position: relative;bor…

windows环境下安装elasticsearch、kibana

通过本文可以快速在windows系统上安装elasticsearch、kibana环境。 当你用Integer类型的时候&#xff0c;要非常小心&#xff0c;因为100等于100、但是200不等于200&#xff0c;当然&#xff0c;如果你会一点小花招&#xff0c;也可以让100不等于100、让200等于200。(运算符比较…

优化供应链和库存管理:PDM系统的物料控制之道

在现代制造业中&#xff0c;优化供应链和库存管理是企业实现高效运营和降低成本的重要目标。PDM系统作为一款强大的数字化工具&#xff0c;扮演着物料控制之道的角色&#xff0c;帮助企业实现优化供应链和库存管理的目标。让我们一同深入探讨&#xff0c;看看PDM系统是如何通过…

git clone 登录 github

git clone 登录 github 目录概述需求&#xff1a; 设计思路实现思路分析1.github 设置setting2.输入passwd 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result…

mac切换jdk版本

查询mac已有版本 1、打开终端&#xff0c;输入&#xff1a; /usr/libexec/java_home -V注意&#xff1a;输入命令参数区分大小写(必须是-V) 2.目前本地装有两个版本的jdk xxxxedydeMacBook-Pro-9 ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (2):20.0.1 (…

Cocos Creator不规则按钮

实现该功能需要用到组件PolygonCollider2D&#xff0c;官方链接&#xff1a; https://docs.cocos.com/creator/3.4/manual/zh/physics-2d/physics-2d-collider.html 创建组件 创建一个精灵节点&#xff1a; 创建碰撞组件PolygonColider2D&#xff0c;如图 给按钮添加多边形碰…

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板&#xff0c;该原型已全国一二级省市选择器为案例&#xff0c;因为该原型用中继器做的&#xff0c;所以制作完成之后使用也很方便&#xff0c;只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…

超全整理——116道网络安全工程师面试真题(附答案),建议收藏!

随着国家对网络安全的重视度&#xff0c;促使这个职业也变得炙手可热&#xff0c;越来越多的年轻人为进入安全领域在做准备。 数以百计的面试&#xff0c;为何迟迟无法顺利入职&#xff1f;能力无疑是至关重要的&#xff0c;可却有不少能力不比已入职的同事差却应聘失败的人&a…