DolphinScheduler3.1简介、部署、功能介绍以及架构设计

1.DolphinScheduler简介

1-1.关于DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。

Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的关系。 解决数据研发ETL依赖错综复杂,无法监控任务健康状态的问题。 DolphinScheduler 以 DAG(Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。

1-2.DolphinScheduler特性

1-3.DolphinScheduler环境配置建议

1-3-1.Linux操作系统版本要求

操作系统版本
Red Hat Enterprise Linux7.0 及以上
CentOS7.0 及以上
Oracle Enterprise Linux7.0 及以上
Ubuntu LTS16.04 及以上

注意: 以上 Linux 操作系统可运行在物理服务器以及 VMware、KVM、XEN 主流虚拟化环境上

1-3-2.服务器配置建议

DolphinScheduler 支持运行在 Intel x86-64 架构的 64 位通用硬件服务器平台。对生产环境的服务器硬件配置有以下建议:

对于生产环境配置要求建议:

CPU内存硬盘类型网络实例数量
4核+8 GB+SAS千兆网卡3

注意:

  • 以上建议配置为部署 DolphinScheduler 的最低配置,生产环境强烈推荐使用更高的配置
  • 硬盘大小配置建议 50GB+ ,系统盘和数据盘分开

1-3-3.网络要求

DolphinScheduler正常运行提供如下的网络端口配置:

组件默认端口说明
MasterServer5678非通信端口,只需本机端口不冲突即可
WorkerServer1234非通信端口,只需本机端口不冲突即可
ApiApplicationServer12345提供后端通信端口

注意:

  • MasterServer 和 WorkerServer 不需要开启网络间通信,只需本机端口不冲突即可
  • 管理员可根据实际环境中 DolphinScheduler 组件部署方案,在网络侧和主机侧开放相关端口

1-3-4.客户端Web浏览器要求

DolphinScheduler 推荐 Chrome浏览器 以及使用 Chromium 内核的较新版本浏览器访问前端可视化操作界面

1-4.DolphinScheduler常用术语解释

1-4-1.术语解释

1-4-2.模块介绍

服务说明
MasterServer主要负责 DAG的切分和任务状态的监控
WorkerServer/LoggerServer主要负责任务的提交、执行和任务状态的更新。LoggerServer 用于 Rest Api 通过 RPC 查看日志
ApiServer提供 Rest Api 服务,供 UI 进行调用
AlertServer提供告警服务
UI前端页面展示

2.dolphinscheduler3.1.1集群部署(Cluster)

本次部署相关安装包以及依赖组件安装文件均汇总在网盘:

链接:https://pan.baidu.com/s/1RLZr2BJRhWl7zFVD98j1mg?pwd=7y8o 提取码:7y8o

  • mysql目录

    • 用于MySQL应用部署,如果已经有了MySQL5.7环境可以不用下载
  • apache-dolphinscheduler-3.1.1-bin.tar.gz

    • 用于部署dolphinscheduler-3.1.1版本安装包
  • apache-zookeeper-3.5.7-bin.tar.gz

    • 用于部署zookeeper服务
  • jdk-8u171-linux-x64.tar.gz

    • 用于部署java1.8环境,如果不是新服务器,一般都已经有java1.8环境
  • mysql-connector-java-8.0.20.jar

    • 用于应用与MySQL之间的连接jdbc协议

2-1.环境准备

2-1-1.机器准备

服务器IP主机名CPU/内存/磁盘操作系统
172.28.54.210dolphinscheduler014c/8g/100gCentOS 7.4
172.28.54.211dolphinscheduler024c/8g/100gCentOS 7.4
172.28.54.212dolphinscheduler034c/8g/100gCentOS 7.4

2-1-2.规划主机名

2-1-3.环境优化【所有机器】

2-1-4.安装java1.8环境【所有机器】

JDK:下载JDK (1.8+),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果环境中已存在,可以跳过这步

2-1-5.数据库部署

数据库:PostgreSQL (8.2.15+) 或者 MySQL (5.7+),两者任选其一即可,如 MySQL 则需要 JDBC Driver 8.0.16 +

  • 如果已经有MySQL实例,可以跳过这步
  • 建议MySQL部署在相对稳定的机器上
  • 大多数用户都可以yum安装或者生产环境有专门的MySQL实例,如是纯离线环境又没有现成的,可以在网盘中下载MySQL安装rpm包,按照顺序安装即可

2-1-6.ZooKeeper安装部署【所有机器】

注册中心:ZooKeeper (3.4.6+)

【注意】:

  • server.1 / server.2 / server.3 中的 1 2 3 对应的就是zkData目录中myid中的值
  • server后面的dolphinscheduler01 / dolphinscheduler02 / dolphinscheduler03 没采用IP地址是因为配置了/etc/hosts的解析

配置cluster信息解读:

server.A=B:C:D [ server.1=dolphinscheduler01:2888:3888 ( A=1 , B=dolphinscheduler01 , C=2888, D=3888) A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件myid,这个文件在配置的data目录下,这个文件里面数值就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。 B 是这个服务器的地址; C 是这个服务器Follower与集群中的Leader服务器交换信息的端口; D 是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

2-2.安装部署dolphinscheduler

2-2-1.解压安装包

2-2-2配置部署用户以及权限【所有机器】

创建部署用户,并且一定要配置 sudo 免密。以创建 dolphinscheduler 用户为例

每台服务器均需要执行

2-2-3.配置机器SSH免密登陆【所有机器】

由于安装的时候需要向不同机器发送资源,所以要求各台机器间能实现SSH免密登陆。配置免密登陆的步骤如下

2-2-4.修改dolphinscheduler相关配置文件

文件 install_env.sh 描述了哪些机器将被安装 DolphinScheduler 以及每台机器对应安装哪些服务。您可以在路径 bin/env/install_env.sh 中找到此文件,可通过以下方式更改env变量,export <ENV_NAME>=,配置详情如下

注意:

  • JAVA_HOME根据自己实际情况配置修改正确路径
  • 最后的配置,这里没有列出来的,暂时可以不配置

2-2-5.初始化数据库

DolphinScheduler 元数据存储在关系型数据库中,目前支持 PostgreSQL 和 MySQL

如果使用 MySQL 需要手动下载 mysql-connector-java 驱动 (8.0.16+) 并移动到 DolphinScheduler 的每个模块的 libs 目录下,其中包括 api-server/libs 和 alert-server/libs 和 master-server/libs 和 worker-server/libs和tools/libs

依赖包已经在分享的云盘中

完成上述步骤后,已经为 DolphinScheduler 创建一个新数据库dolphinscheduler,现在可以通过快速的 Shell 脚本来初始化数据库,用来建应用使用的各类table表

如果MySQL连接异常,这一步则会执行失败,如果报错可以查看MySQL的相关配置和操作

也可以到MySQL的dolphinscheduler库下去查看是否创建表成功:

2-2-6.安装部署dolphinscheduler

install.sh安装启动dolphinscheduler

注意:只有第一次是使用bash ./bin/install.sh,成功部署完毕后,以后都是用bash ./bin/stop-all.sh和bash ./bin/start-all.sh

install.sh可以理解成会把/usr/local/apache-dolphinscheduler-3.1.1-bin/目录下修改的文件分发到各个机器,然后逐个去启动

查看服务角色分布情况:

后续通过URL访问连接则对应的是dolphinscheduler01服务器的ApiApplicationServer服务,对应端口是12345

2-2.7.登录访问DolphinScheduler

浏览器访问地址 http://localhost:12345/dolphinscheduler/ui 即可登录系统UI。

默认的用户名和密码是 :admin / dolphinscheduler123

Apache DolphinScheduler 首页可让您查看用户所有项目的任务状态统计、工作流状态统计和项目统计。 这是观察整个系统状态以及深入各个进程以检查任务和任务日志的每个状态的最佳方式

2-2-8.DolphinScheduler集群启动停止服务

3.DolphinScheduler功能介绍

3-1.项目管理

3-1-1.项目列表

点击"项目管理"进入项目管理页面,点击“创建项目”按钮,输入项目名称,项目描述,点击“提交”,创建新的项目。

项目创建完成后,点击项目名称即可进入到指定项目的首页

3-1-2.工作流定义

3-1-2-1.创建工作流

添加 Shell 任务的参数设置:

按照Node_test_A方式再创建Node_test_B和Node_test_C,这时候画板中的A、B、C 三个节点都是相互独立的,并没有关联

 

执行策略:

  • 并行:如果对于同一个工作流定义,同时有多个工作流实例,则并行执行工作流实例
  • 串行等待:如果对于同一个工作流定义,同时有多个工作流实例,则并行执行工作流实例
  • 串行抛弃:如果对于同一个工作流定义,同时有多个工作流实例,则抛弃后生成的工作流实例并杀掉正在跑的实例
  • 串行优先:如果对于同一个工作流定义,同时有多个工作流实例,则按照优先级串行执行工作流实例

3-1-2-2.工作流定义操作功能

点击项目管理->工作流->工作流定义,进入工作流定义页面,如下图所示:

工作流定义列表的操作功能如下:

3-1-2-3.运行工作流

工作流运行参数说明:

运行任务需要新加一个租户:

安全中心后面展开介绍,这里先跑通流程

点击确定后,则工作流会开始运行

3-1-2-4.单独运行工作流中的任务

3-1-2-5.工作流定时

创建定时:点击项目管理->工作流->工作流定义,进入工作流定义页面,上线工作流,点击"定时"按钮,弹出定时参数设置弹框

3-1-2-6.导出工作流

点击操作中的导出,可以导出一个json文件到本地

workflow_1668875701525.json

3-1-2-6.删除工作流

点击操作上的删除按钮,点击确定即可

3-1-2-7.导出工作流

点击项目管理->工作流->工作流定义,进入工作流定义页面,点击"导入工作流"按钮,导入本地工作流文件,工作流定义列表显示导入的工作流,状态为下线。

3-1-3.工作流实例

将导入的工作流wf_test_for_ABC_import_20221120004014956点击运行,工作流中的单个任务点击运行,产生一些运行实例

3-1-3-1.查看工作流实例

点击项目管理->工作流->工作流实例,进入工作流实例页面

点击工作流名称,进入DAG查看页面,查看任务执行状态

3-1-3-2.查看任务日志

3-1-3-3.查看任务历史记录

3-1-3-4.查看运行参数

3-1-3-5.工作流实例操作功能

点击项目管理->工作流->工作流实例,进入工作流实例页面,在操作中有各类常用常用按钮

3-1-4.任务实例

点击项目管理->工作流->任务实例,进入任务实例页面,如下图所示,点击工作流实例名称,可跳转到工作流实例DAG图查看任务状态

查看日志:点击操作列中的“查看日志”按钮,可以查看任务执行的日志情况

3-1-5.任务定义

使用 Apache DolphinScheduler 3.0.0 此前版本,用户如果想要操作任务,需要先找到对应的工作流,并在工作流中定位到任务的位置之后才能编辑。然而,当工作流数量变多或单个工作流有较多的任务时,找到对应任务的过程将会变得非常痛苦,这不是 Apache DolphinScheduler 所追求的 easy to use 理念。所以,我们在 3.0.0 中增加了任务定义页面,让用户可以通过任务名称快速定位到任务,并对任务进行操作,轻松实现批量任务变更。

批量任务定义允许用户在基于任务级别而不是在工作流中操作修改任务。再此之前,我们已经有了工作流级别的任务编辑器,可以在工作流定义 单击特定的工作流,然后编辑任务的定义,并不是这里可以一次性创建很多新任务的意思。

在该视图中,可以通过单击 操作 列中的相关按钮来进行创建、查询、更新、删除任务定义。可以通过通配符进行全部任务查询,当只记得任务名称但忘记它属于哪个工作流时是非常有用的。也支持通过任务名称结合使用 任务类型 或 工作流程名称进行查询

3-2.任务类型

dolphinscheduler有非常丰富的任务类型插件,几乎可以覆盖全部的数据处理任务的场景,这里简单介绍一下任务的描述,具体每个任务类型的使用是一个漫长的学习过程和经验积累。

针对每一个任务类型,可以在官方项目文档中找到对应的任务插件的详细介绍使用

3-3.参数

3-3-1.内置参数

3-3-1-1.基础内置参数

变量名声明方式含义
system.biz.date${system.biz.date}日常调度实例定时的定时时间前一天,格式为 yyyyMMdd
system.biz.curdate${system.biz.curdate}日常调度实例定时的定时时间,格式为 yyyyMMdd
system.datetime${system.datetime}日常调度实例定时的定时时间,格式为 yyyyMMddHHmmss

3-3-1-2.衍生内置参数

3-3-2.全局参数

在某个工作流下创建任务时,需要将此工作流选为下线状态

注意:

  1. 这里定义的 dt 参数可以被其它任一节点的局部参数引用

3-3-3.本地参数

通过自定义参数使用

创建一个新任务Node_test_E

参数说明:

可以看到在工作流中定义的dt为前一天的变量并未影响到子任务中的定义,优先使用的为任务定义中的变量

通过 setValue export 本地参数

如果你想简单 export 参数然后在下游任务中使用它们,你可以在你的任务中使用 setValue,你可以将参数统一在一个任务中管理。在 Shell 任务中使用语法 echo '${setValue(wow=20230123)}'(不要忘记单引号) 并添加新的 OUT 自定义参数来 export 它

创建任务Node_test_F

创建任务Node_test_G

在工作流中将F任务和G任务形成上下游关系

此时运行任务,验证G任务是否可以打印出echo '${wow}',取到F任务中定义的变量

3-3-4.参数传递

DolphinScheduler 提供参数间相互引用的能力,包括:本地参数引用全局参数、上下游参数传递。因为有引用的存在,就涉及当参数名相同时,参数的优先级问题

注意:若节点之间没有依赖关系,则局部参数无法通过上游传递

3-3-5.参数优先级

DolphinScheduler 中所涉及的参数值的定义可能来自三种类型:

因为参数的值存在多个来源,当参数名相同时,就需要会存在参数优先级的问题。DolphinScheduler 参数的优先级从高到低为:

在上游任务传递的参数中,由于上游可能存在多个任务向下游传递参数,当上游传递的参数名称相同时:

3-4.数据源中心

数据源中心接入支持:

这里简单拿MySQL做一下介绍,其它数据源基本参照官方文档配置即可

MySQL

添加一个SQL任务

运行任务后,查看日志:

3-5.告警

告警通知支持方式:

3-6.资源中心

资源中心通常用于上传文件、UDF 函数和任务组管理。 对于 standalone 环境,可以选择本地文件目录作为上传文件夹(此操作不需要Hadoop部署)。当然,你也可以 选择上传到 Hadoop 或者 MinIO 集群。 在这种情况下,您需要有 Hadoop(2.6+)或 MinION 等相关环境。

 

3-7.监控中心

3-8.安全中心

安全中心只有管理员账户才有权限操作,分别有队列管理、租户管理、用户管理、告警组管理、worker分组管理、令牌管理等功能,在用户管理模块可以对资源、数据源、项目等授权

4.架构设计

4-1.元数据文档

4-2.架构设计

4-2-1.系统架构图

4-2-2.启动流程活动图

4-2-3.架构说明

ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望DolphinScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现

4-3.配置文件

DolphinScheduler目录结构:

Master Server相关配置:

位置:master-server/conf/application.yaml

参数默认值描述
master.listen-port5678master监听端口
master.fetch-command-num10master拉取command数量
master.pre-exec-threads10master准备执行任务的数量,用于限制并行的command
master.exec-threads100master工作线程数量,用于限制并行的流程实例数量
master.dispatch-task-number3master每个批次的派发任务数量
master.host-selectorlower_weightmaster host选择器,用于选择合适的worker执行任务,可选值: random, round_robin, lower_weight
master.heartbeat-interval10master心跳间隔,单位为秒
master.task-commit-retry-times5任务重试次数
master.task-commit-interval1000任务提交间隔,单位为毫秒
master.state-wheel-interval5轮询检查状态时间
master.max-cpu-load-avg-1master最大cpuload均值,只有高于系统cpuload均值时,master服务才能调度任务. 默认值为-1: cpu cores * 2
master.reserved-memory0.3master预留内存,只有低于系统可用内存时,master服务才能调度任务,单位为G
master.failover-interval10failover间隔,单位为分钟
master.kill-yarn-job-when-task-failovertrue当任务实例failover时,是否kill掉yarn job
master.registry-disconnect-strategy.strategystop当Master与注册中心失联之后采取的策略, 默认值是: stop. 可选值包括: stop, waiting
master.registry-disconnect-strategy.max-waiting-time100s当Master与注册中心失联之后重连时间, 之后当strategy为waiting时,该值生效。 该值表示当Master与注册中心失联时会在给定时间之内进行重连, 在给定时间之内重连失败将会停止自己,在重连时,Master会丢弃目前正在执行的工作流,值为0表示会无限期等待
master.master.worker-group-refresh-interval10s定期将workerGroup从数据库中同步到内存的时间间隔

Worker Server相关配置: 位置:worker-server/conf/application.yaml

参数默认值描述
worker.listen-port1234worker监听端口
worker.exec-threads100worker工作线程数量,用于限制并行的任务实例数量
worker.heartbeat-interval10worker心跳间隔,单位为秒
worker.host-weight100派发任务时,worker主机的权重
worker.tenant-auto-createtrue租户对应于系统的用户,由worker提交作业.如果系统没有该用户,则在参数worker.tenant.auto.create为true后自动创建。
worker.max-cpu-load-avg-1worker最大cpuload均值,只有高于系统cpuload均值时,worker服务才能被派发任务. 默认值为-1: cpu cores * 2
worker.reserved-memory0.3worker预留内存,只有低于系统可用内存时,worker服务才能被派发任务,单位为G
worker.alert-listen-hostlocalhostalert监听host
worker.alert-listen-port50052alert监听端口
worker.registry-disconnect-strategy.strategystop当Worker与注册中心失联之后采取的策略, 默认值是: stop. 可选值包括: stop, waiting
worker.registry-disconnect-strategy.max-waiting-time100s当Worker与注册中心失联之后重连时间, 之后当strategy为waiting时,该值生效。 该值表示当Worker与注册中心失联时会在给定时间之内进行重连, 在给定时间之内重连失败将会停止自己,在重连时,Worker会丢弃kill正在执行的任务。值为0表示会无限期等待
worker.task-execute-threads-full-policyREJECT如果是 REJECT, 当Worker中等待队列中的任务数达到exec-threads时, Worker将会拒绝接下来新接收的任务,Master将会重新分发该任务; 如果是 CONTINUE, Worker将会接收任务,放入等待队列中等待空闲线程去执行该任务

Alert Server相关配置 位置:alert-server/conf/application.yaml

参数默认值描述
server.port50053Alert Server监听端口
alert.port50052alert监听端口

4-4.负载均衡

负载均衡即通过路由算法(通常是集群环境),合理的分摊服务器压力,达到服务器性能的最大优化。

DolphinScheduler-Worker 负载均衡算法

DolphinScheduler-Master 分配任务至 worker,默认提供了三种算法:

加权随机(random)

平滑轮询(roundrobin)

线性负载(lowerweight)

默认配置为线性加权负载。

由于路由是在客户端做的,即 master 服务,因此你可以更改 master.properties 中的 master.host.selector 来配置你所想要的算法。

eg:master.host.selector=random(不区分大小写)

5.启动多ApiServer通过nginx代理实现连接高可用

当前访问dolphinscheduler为:

浏览器访问地址 http://ApiServerIp:12345/dolphinscheduler/ui 即可登录系统UI。

默认的用户名和密码是 :admin / dolphinscheduler123

为了避免ApiServer单点故障,虽然dolphinscheduler自身运行高可用,还在运作,但是没有了界面管理访问,影响也较大;所以启动多ApiServer通过nginx代理实现连接高可用,通过这个方案最终实现访问多入口,任务调度多master,加固整体稳定性

  1. 关闭dolphinscheduler集群
  1. 修改install_env.sh配置
  1. 使用install.sh重新安装启动dolphinscheduler
  1. 查看各组件服务

此时已经部署完毕,验证访问:

当前访问dolphinscheduler为:

http://dolphinscheduler01:12345/dolphinscheduler/ui

http://dolphinscheduler02:12345/dolphinscheduler/ui

http://dolphinscheduler03:12345/dolphinscheduler/ui

默认的用户名和密码是 :admin / dolphinscheduler123

此时3个地址均可以访问

使用nginx负载均衡配置:

最后通过nginx代理的URL访问,此时ApiServer服务即使服务有一个异常,依然可以正常访问