DolphinScheduler架构和实现中有非常多的优秀设计思想,详细可以查阅官方说明,下面是核心点简述:
DolphinScheduler-Master 分配任务至 worker,默认配置为线性加权负载。由于路由是在客户端做的,即 master 服务,可以更改 master.properties 中的 master.host.selector 来配置算法。eg:master.host.selector=random(不区分大小写);提供了三种算法:
Worker 负载均衡配置:配置文件 worker.properties,权重
负载均衡算法细述
由于在master-server调度过程中,会产生大量的数据库读取操作,如tenant,user,processDefinition等,一方面对DB产生很大的读压力,另一方面则会使整个核心调度流程变得缓慢;考虑到这部分业务数据是读多写少的场景,故引入了缓存模块,以减少DB读压力,加快核心调度流程;缓存模块采用spring-cache机制,可直接在spring配置文件中配置是否开启缓存(默认none关闭), 缓存类型;
DolphinScheduler 中所涉及的参数值的定义可能来自三种类型:
因为参数的值存在多个来源,当参数名相同时,就需要会存在参数优先级的问题。DolphinScheduler 参数的优先级从高到低为:本地参数 > 上游任务传递的参数 > 全局参数
在上游任务传递的参数中,由于上游可能存在多个任务向下游传递参数,当上游传递的参数名称相同时:
基础内置参数
变量名 | 声明方式 | 含义 |
---|---|---|
system.biz.date | ${system.biz.date} | 日常调度实例定时的定时时间前一天,格式为 yyyyMMdd |
system.biz.curdate | ${system.biz.curdate} | 日常调度实例定时的定时时间,格式为 yyyyMMdd |
system.datetime | ${system.datetime} | 日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss |
衍生内置参数
支持代码中自定义变量名,声明方式:${变量名}。可以是引用 "系统参数"
我们定义这种基准变量为 [...]格式的,[...]格式的,[yyyyMMddHHmmss] 是可以任意分解组合的,比如:[yyyyMMdd],[yyyyMMdd],[HHmmss], $[yyyy-MM-dd] 等
也可以通过以下两种方式:
使用add_months()函数,该函数用于加减月份, 第一个入口参数为[yyyyMMdd],表示返回时间的格式 第二个入口参数为月份偏移量,表示加减多少个月
直接加减数字 在自定义格式后直接“+/-”数字
本地参数的作用域:在任务定义页面配置的参数,默认作用域仅限该任务,如果配置了参数传递则可将该参数作用到下游任务中。
使用前面shell演示工作流定义,在shell-nodeA添加本地参数:
全局参数作用域:全局参数是指针对整个工作流的所有任务节点都有效的参数,在工作流定义页面配置。本地任务引用全局参数的前提是已经定义了全局参数,使用方式和本地参数中的使用方式类似,但是参数的值需要配置成全局参数中的 key。
在shell-nodeB和shell-nodeC中的脚本输出echo ${dt},然后点击保存工作流,添加全局变量
从任务实例点击右边查看日志,可以看到shell-nodeA输出的是当天日期2022-08-02,而shell-nodeB和shell-nodeC输出的是前一天日期2022-08-01。
DolphinScheduler 允许在任务间进行参数传递,目前传递方向仅支持上游单向传递给下游。目前支持这个特性的任务类型有Shell、SQL、Procedure。
当定义上游节点时,如果有需要将该节点的结果传递给有依赖关系的下游节点,需要在【当前节点设置】的【自定义参数】设置一个方向是 OUT 的变量。目前我们主要针对 SQL 和 SHELL 节点做了可以向下传递参数的功能。
下面通过 SHELL 任务来创建本地参数并赋值传递给下游,用户需要传递参数,在定义 SHELL 脚本时,需要输出格式为 ${setValue(key=value)} 的语句,key 为对应参数的 prop,value 为该参数的值。在shell-nodeA任务节点中的自定义参数中添加设置参数传递如下:
在shell-nodeC中脚本输出echo ${transfer},保存工作流定义-上线-运行,查看shell-nodeC任务示例的日志,可以得到输出了20220701达到工作流参数。
数据源中心支持MySQL、POSTGRESQL、HIVE/IMPALA、SPARK、CLICKHOUSE、ORACLE、SQLSERVER等数据源。
以 MySQL 为例,如果想要使用 MySQL 数据源,需要先在 mysql maven 仓库 中下载对应版本的 JDBC 驱动,将其移入 api-server/libs
以及 worker-server/libs
文件夹中,最后重启 api-server
和 worker-server
服务,即可使用 MySQL 数据源。如果你使用容器启动 DolphinScheduler,同样也是将 JDBC 驱动挂载放到以上两个服务的对应路径下后,重启驱动即可。
由于前面部署DolphinScheduler集群已将MySQL的驱动复制到所有节点master和worker、api-server、alert-server上了,因此这里可以开始创建MySQL数据源
jdbc连接参数如下:
{
"useSSL": "false",
"useUnicode": "true",
"characterEncoding": "utf-8",
"allowMultiQueries": "true",
"zeroDateTimeBehavior": "convertToNull",
"allowPublicKeyRetrieval": "true"
}
点击数据源记录的数据源参数
这里我们使用前面部署好的ClickHouse,CLICKHOUSE数据源驱动原生已支持
拖拉SQL引擎图标,创建名称为sql_node1任务定义
insert into table01
values('1001',99.9,'2022-08-02 22:00:00');
CREATE TABLE table01
(
`id` String,
`price` Float64,
`create_time` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(create_time)
ORDER BY id;
创建名称为sql_node2任务定义
insert into table02
values('1002',199.9,'2022-08-02 23:00:00');
CREATE TABLE table02
(
`id` String,
`price` Float64,
`create_time` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(create_time)
ORDER BY id;
insert into table03 select * from table01
union all select * from table02;
CREATE TABLE table03
(
`id` String,
`price` Float64,
`create_time` DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(create_time)
ORDER BY id;
编辑好工作流的依赖关系,sql_node1和sql_node2都完成后再执行sql_node3,保存名称为sql演示工作流。
上线sql演示工作流并点击执行,查询工作流实例执行结果
查询任务实例执行结果
使用ClickHouse的客户端登录ClickHouse查询数据,已经显示正确的结果
大部分任务都会有定时运行的需求,这就需要定时工作流,创建步骤:点击项目管理->工作流->工作流定义,进入工作流定义页面,上线工作流,点击"定时"按钮,弹出定时参数设置弹框:
选择起止时间。在起止时间范围内,定时运行工作流;不在起止时间范围内,不再产生定时工作流实例。
添加一个每隔 5 分钟执行一次的定时。
失败策略、通知策略、流程优先级、Worker 分组、通知组、收件人、抄送人同工作流运行参数。
点击"创建"按钮,创建定时成功,此时定时状态为"下线",定时需上线才生效。
定时上线:点击"定时管理"按钮,进入定时管理页面,点击"上线"按钮,定时状态变为"上线",如下图所示,工作流定时生效。
用户需要创建告警实例,在创建告警实例时,需要选择告警策略,有三个选项,成功发、失败发,以及成功和失败都发。在执行完工作流或任务时,如果触发告警,调用告警实例发送方法会进行逻辑判断,将告警实例与任务状态进行匹配,匹配则执行该告警实例发送逻辑,不匹配则过滤。创建完告警实例后,需要同告警组进行关联,一个告警组可以使用多个告警实例。 告警模块支持场景如下:
先准备一个邮箱,开启POP3/SMTP服务,由于是要用来发送主要是SMTP,得到授权码,保存修改。
使用管理员用户登录,进入到安全中心,选择告警实例管理,创建一个告警实例,然后选择对应的告警插件EMAIL,填写相关如下参数。
然后选择告警组管理,创建告警组,选择相应的告警实例即可。
工作流定义运行中配置通知策略为成功或失败都发,告警组为前面创建测试告警组
查看邮箱确认已收到邮件信息