Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
阅读原文时间:2023年07月08日阅读:1

概述

dolphinscheduler 官网地址 https://dolphinscheduler.apache.org/

dolphinscheduler GitHub地址 https://github.com/apache/dolphinscheduler

Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,不能直观监控任务健康状态等问题,使调度系统在数据处理流程中开箱即用;以DAG流式的方式将Task组装起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及Kill任务等操作。

  • 高可靠性:去中心化的多Master和多Worker服务对等架构, 避免单Master压力过大,另外采用任务缓冲队列来避免过载。实现集群HA,通过Zookeeper实现Master集群和Worker集群去中心化。

  • 简单易用:DAG监控界面,所有流程定义都是可视化,通过拖拽任务完成定制DAG,通过API方式与第三方系统集成, 一键部署。以DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态。

  • 丰富的使用场景:支持多租户,支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作。

  • 高扩展性:支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master和Worker支持动态上下线。

  • 紧密贴合大数据生态,支持丰富的任务类型,提供Flink、Spark、 Hive, M/R、Python、Sub_process、SQL(mysql、postgresql、hive、sparksql)、Shell等近20种任务类型。

  • 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败。

  • 支持工作流全局参数及节点自定义参数设置。

  • 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑。

  • 支持任务日志在线查看及滚动、在线下载日志等。

  • 支持对Master/Worker cpu load,memory,cpu在线查看。

  • 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计。

  • 支持补数。

  • 支持国际化。

  • DAG: 全称 Directed Acyclic Graph,简称 DAG。工作流中的 Task 任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。

  • 流程定义:通过拖拽任务节点并建立任务节点的关联所形成的可视化DAG

  • 流程实例:流程实例是流程定义的实例化,可以通过手动启动或定时调度生成,流程定义每运行一次,产生一个流程实例。

  • 任务实例:任务实例是流程定义中任务节点的实例化,标识着具体的任务执行状态。

  • 任务类型:目前支持有 SHELL、SQL、SUB_PROCESS(子流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划支持动态插件扩展,注意:其中子 SUB_PROCESS 也是一个单独的流程定义,是可以单独启动执行的。

  • 调度方式:系统支持基于 cron 表达式的定时调度和手动调度。命令类型支持:启动工作流、从当前节点开始执行、恢复被容错的工作流、恢复暂停流程、从失败节点开始执行、补数、定时、重跑、暂停、停止、恢复等待线程。 其中 恢复被容错的工作流恢复等待线程 两种命令类型是由调度内部控制使用,外部无法调用。

  • 定时调度:系统采用 quartz 分布式调度器,并同时支持cron表达式可视化的生成。

  • 依赖:系统不单单支持 DAG 简单的前驱和后继节点之间的依赖,同时还提供任务依赖节点,支持流程间的自定义任务依赖

  • 优先级 :支持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出。

  • 邮件告警:支持 SQL任务 查询结果邮件发送,流程实例运行结果邮件告警及容错告警通知。

  • 失败策略:对于并行运行的任务,如果有任务失败,提供两种失败策略处理方式,继续是指不管并行运行任务的状态,直到流程失败结束。结束是指一旦发现失败任务,则同时Kill掉正在运行的并行任务,流程失败结束。

  • 补数:补历史数据,支持区间并行和串行两种补数方式。

  • dolphinscheduler-alert 告警模块,提供 AlertServer 服务。

  • dolphinscheduler-api web应用模块,提供 ApiServer 服务。

  • dolphinscheduler-common 通用的常量枚举、工具类、数据结构或者基类

  • dolphinscheduler-dao 提供数据库访问等操作。

  • dolphinscheduler-remote 基于 netty 的客户端、服务端

  • dolphinscheduler-server MasterServer 和 WorkerServer 服务

  • dolphinscheduler-service service模块,包含Quartz、Zookeeper、日志客户端访问服务,便于server模块和api模块调用

  • dolphinscheduler-ui 前端模块

部署

Linux 操作系统版本要求:

操作系统

版本

Red Hat Enterprise Linux

7.0 及以上

CentOS

7.0 及以上

Oracle Enterprise Linux

7.0 及以上

Ubuntu LTS

16.04 及以上

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

CPU

内存

硬盘类型

网络

实例数量

4核+

8 GB+

SAS

千兆网卡

1+

注意:

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

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

组件

默认端口

说明

MasterServer

5678

非通信端口,只需本机端口不冲突即可

WorkerServer

1234

非通信端口,只需本机端口不冲突即可

ApiApplicationServer

12345

提供后端通信端口

注意:

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

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

如果是简单体验 DolphinScheduler 的功能则使用Standalone方式接口,这里可以使用二进制也可以docker方式安装;如果想体验更完整的功能或者更大的任务量推荐使用伪集群部署,这里可以使用二进制也可以docker-compose方式安装;如果你是在生产中使用,推荐使用集群部署或者kubernetes;我们这里则选择更好理解其架构和组成的二进制集群部署方式。

# 下载最新版本3.0.0-beta-2,也可以选择2.0.6
wget https://dlcdn.apache.org/dolphinscheduler/3.0.0-beta-2/apache-dolphinscheduler-3.0.0-beta-2-bin.tar.gz
# 解压文件
tar -xvf apache-dolphinscheduler-3.0.0-beta-2-bin.tar.gz

准备三台服务器安装集群,ZooKeeper和MySQL 使用之前文章已部署好的,下面前置准备工作和准备启动环境都是在三台上都要执行

安装每一台服务器都准备下面的前置条件

  • JDK(1.8+)

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

  • 注册中心:ZooKeeper (3.4.6+)

  • 进程树分析

    • macOS安装pstree
    • Fedora/Red/Hat/CentOS/Ubuntu/Debian安装psmisc yum -y install psmisc
  • 注意: DolphinScheduler 本身不依赖 Hadoop、Hive、Spark,但如果你运行的任务需要依赖他们,就需要有对应的环境支持。

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

    创建用户需使用 root 登录

    useradd dolphinscheduler

    添加密码

    echo "dolphinscheduler" | passwd --stdin dolphinscheduler

    配置 sudo 免密

    sed -i '$adolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL' /etc/sudoers
    sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers

    修改目录权限,使得部署用户对二进制包解压后的 apache-dolphinscheduler-*-bin 目录有操作权限

    chown -R dolphinscheduler:dolphinscheduler apache-dolphinscheduler-*-bin

注意:因为任务执行服务是以 sudo -u {linux-user} 切换不同 linux 用户的方式来实现多租户运行作业,所以部署用户需要有 sudo 权限,而且是免密的。初学习者不理解的话,完全可以暂时忽略这一点。如果发现 /etc/sudoers 文件中有 "Defaults requirett" 这行,也请注释掉。

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

    su dolphinscheduler
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys

    在运行install.sh机器上配置连接其他机器的免密

    scp ~/.ssh/id_rsa.pub dolphinscheduler@192.168.5.53:/tmp/dolphinscheduler
    scp ~/.ssh/id_rsa.pub dolphinscheduler@192.168.12.27:/tmp/dolphinscheduler

    在192.168.5.53和192.168.12.27上执行

    cat /tmp/dolphinscheduler/id_rsa.pub >> ~/.ssh/authorized_keys

注意: 配置完成后,可以通过运行命令 ssh localhost 判断是否成功,如果不需要输入密码就能ssh登陆则证明成功。

完成基础环境的准备后,需要根据你的机器环境修改配置文件。配置文件可以在目录 bin/env 中找到,他们分别是 并命名为 install_env.shdolphinscheduler_env.sh

install_env.sh修改内容如下:

ips=${ips:-"192.168.5.52,192.168.5.53,192.168.12.27"}
sshPort=${sshPort:-"22"}
masters=${masters:-"192.168.5.52,192.168.5.53"}
workers=${workers:-"192.168.5.52:default,192.168.5.53:default,192.168.12.27:default"}
alertServer=${alertServer:-"192.168.5.52"}
apiServers=${apiServers:-"192.168.5.53"}
installPath=${installPath:-"/tmp/dolphinscheduler"}
deployUser=${deployUser:-"dolphinscheduler"}
zkRoot=${zkRoot:-"/dolphinscheduler"}

dolphinscheduler_env.sh

  • DolphinScheduler 的数据库配置。
  • 一些任务类型外部依赖路径或库文件,如 JAVA_HOMESPARK_HOME都是在这里定义的。
  • 注册中心zookeeper
  • 服务端相关配置,比如缓存,时区设置等。

DolphinScheduler 元数据存储在关系型数据库中,目前支持 PostgreSQL 和 MySQL,这里使用 MySQL 8.0.28则需要手动下载 mysql-connector-java 驱动(8.0.28) 并移动到 DolphinScheduler 的 lib目录下(tools/libs/)。此外其他几个模块也都需要mysql-connector-java-8.0.28.jar

cp tools/libs/mysql-connector-java-8.0.28.jar master-server
cp tools/libs/mysql-connector-java-8.0.28.jar worker-server/libs/
cp tools/libs/mysql-connector-java-8.0.28.jar alert-server/libs/
cp tools/libs/mysql-connector-java-8.0.28.jar api-server/libs/

配置数据库和用户

mysql -uroot -p
mysql> CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
# 修改 {user} 和 {password} 为你希望的用户名和密码
mysql> CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY 'dolphinscheduler123';
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';
mysql> CREATE USER 'dolphinscheduler'@'localhost' IDENTIFIED BY 'dolphinscheduler123';
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'localhost';
mysql> FLUSH PRIVILEGES;

然后修改./bin/env/dolphinscheduler_env.sh,将username和password改成你在上一步中设置的用户名dolphinscheduler和密码dolphinscheduler123

export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://192.168.50.95:3308/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"
export SPRING_DATASOURCE_USERNAME=dolphinscheduler
export SPRING_DATASOURCE_PASSWORD=dolphinscheduler123

完成上述步骤后已为 DolphinScheduler 创建一个新数据库,现在可以通过快速的 Shell 脚本来初始化数据库

sh tools/bin/upgrade-schema.sh

执行后我们查看dolphinscheduler数据库,部分表如下

使用上面创建的部署用户dolphinscheduler运行以下命令完成部署,部署后的运行日志将存放在 logs 文件夹内

sh ./bin/install.sh

查看结果已经成功启动整个集群,每一台都运行配置模块部分

浏览器访问地址 http://192.168.5.53:12345/dolphinscheduler/ui 即可登录系统UI。webUi 在org.apache.dolphinscheduler.api.ApiApplicationServer部署的机器是哪个,默认的用户名和密码是 admin/dolphinscheduler123 ,登录后进入首页,首页包含用户所有项目的任务状态统计、流程状态统计、工作流定义统计。DolphinScheduler 支持两种类型的内置主题,包括 DarkLight。当您想改变主题时,只需单击顶部控制栏在 语言 左侧名为 Dark(or Light) 的按钮即可。项目首页包含该项目的任务状态统计、流程状态统计、工作流定义统计。这几个指标的说明如下

  • 任务状态统计:在指定时间范围内,统计任务实例中状态为提交成功、正在运行、准备暂停、暂停、准备停止、停止、失败、成功、需要容错、kill、等待线程的个数
  • 流程状态统计:在指定时间范围内,统计工作流实例中状态为提交成功、正在运行、准备暂停、暂停、准备停止、停止、失败、成功、需要容错、kill、等待线程的个数
  • 工作流定义统计:统计用户创建的工作流定义及管理员授予该用户的工作流定义

如果需要在某台服务器上启动所有配置的服务或者某个服务

# 一键停止集群所有服务
sh ./bin/stop-all.sh
# 一键开启集群所有服务
sh ./bin/start-all.sh
# 启停 Master
sh ./bin/dolphinscheduler-daemon.sh stop master-server
sh ./bin/dolphinscheduler-daemon.sh start master-server
# 启停 Worker
sh ./bin/dolphinscheduler-daemon.sh start worker-server
sh ./bin/dolphinscheduler-daemon.sh stop worker-server
# 启停 Api
sh ./bin/dolphinscheduler-daemon.sh start api-server
sh ./bin/dolphinscheduler-daemon.sh stop api-server
# 启停 Alert
sh ./bin/dolphinscheduler-daemon.sh start alert-server
sh ./bin/dolphinscheduler-daemon.sh stop alert-server

实战使用

可以查看当前Master、Worker、DB的系统情况,包括CPU、内存和平均负载

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

添加租户

  • 租户对应的是 Linux 的用户,用于 worker 提交作业所使用的用户。如果 linux 没有这个用户,则会导致任务运行失败。你可以通过修改 worker.properties 配置文件中参数 worker.tenant.auto.create=true 实现当 linux 用户不存在时自动创建该用户。worker.tenant.auto.create=true 参数会要求 worker 可以免密运行 sudo 命令
  • 租户编码:租户编码是 Linux上 的用户,唯一,不能重复

添加用户

  • 用户分为管理员用户普通用户

    • 管理员有授权和用户管理等权限,没有创建项目和工作流定义的操作的权限。
    • 普通用户可以创建项目和对工作流定义的创建,编辑,执行等操作。
    • 注意:如果该用户切换了租户,则该用户所在租户下所有资源将复制到切换的新租户下。
  • 编辑用户信息

    • 普通用户登录后,点击用户名下拉框中的用户信息,进入用户信息页面,点击"编辑"按钮,编辑用户信息。
  • 修改用户密码

    • 普通用户登录后,点击用户名下拉框中的用户信息,进入修改密码页面,输入密码并确认密码后点击"编辑"按钮,则修改密码成功。

Worker分组

每个 worker 节点都会归属于自己的 worker 分组,默认分组为 default。在任务执行时,可以将任务分配给指定 worker 分组,最终由该组中的 worker 节点执行该任务。

  • 打开要设置分组的 worker 节点上的 conf/worker.properties 配置文件. 修改 worker.groups 参数.

  • worker.groups 参数后面对应的为该 worker 节点对应的分组名称,默认为 default。

  • 也可以在运行中修改 worker 所属的 worker 分组,如果修改成功,worker 就会使用这个新建的分组,忽略 worker.properties 中的配置。

    worker:
    groups:
    - default
    - bigdatabase

默认有一个default组,三台Worker节点都在这个组里

新建一个大数据基础工作组,选择Worker,确定即可。

项目列表

注销退出系统后用前面创建的普通用户testuser重新登录系统,切换到项目管理模块,点击“创建项目”按钮,输入项目名称,项目描述,点击“提交”,创建演示项目

本篇最后我们就以一个简单执行多个依赖的shell脚本的工作流来揭开使用的大门。

工作流定义

进入工作流定义页面,点击“创建工作流”按钮,进入工作流DAG编辑页面,工具栏中拖拽 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TVT7yVWw-1659111362070)(shell.png)] 到画板中,新增一个Shell任务,如下图所示

  • 添加 Shell 任务的参数设置:

其余两个节点也相同创建方式,创建后通过拖拉编排任务的依赖关系,也可以选择任务节点后选择前置任务;配置任务之间的依赖关系: 点击任务节点的右侧加号连接任务;如下图所示,任务 shell-nodeA 和任务shell-nodeB 并行执行,当任务shell-nodeA和任务shell-nodeB执行完shell-nodeC会同时执行。如要删除依赖关系: 点击右上角"箭头"图标[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QUQtvl6n-1659111362085)(arrow.png)],选中连接线,点击右上角"删除"图标[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vIJI4yCV-1659111362088)(delete.png)],删除任务间的依赖关系。

保存工作流定义: 点击”保存“按钮,弹出"设置DAG图名称"弹框,如下图所示,输入工作流定义名称,工作流定义描述,设置全局参数(选填),点击"添加"按钮,工作流定义创建成功。

进入工作流定义页面,工作流定义列表的操作功能如下:

  • 编辑: 只能编辑"下线"的工作流定义。工作流DAG编辑同创建工作流定义。
  • 上线: 工作流状态为"下线"时,上线工作流,只有"上线"状态的工作流能运行,但不能编辑。
  • 下线: 工作流状态为"上线"时,下线工作流,下线状态的工作流可以编辑,但不能运行。
  • 运行: 只有上线的工作流能运行。运行操作步骤见运行工作流
  • 定时: 只有上线的工作流能设置定时,系统自动定时调度工作流运行。创建定时后的状态为"下线",需在定时管理页面上线定时才生效。定时操作步骤见工作流定时
  • 定时管理: 定时管理页面可编辑、上线/下线、删除定时。
  • 删除: 删除工作流定义。在同一个项目中,只能删除自己创建的工作流定义,其他用户的工作流定义不能进行删除,如果需要删除请联系创建用户或者管理员。
  • 下载: 下载工作流定义到本地。
  • 树形图: 以树形结构展示任务节点的类型及任务状态,如下图所示:

通过如下操作运行工作流,生成工作流示例

工作流示例可以点击重跑按钮

查看任务定义

查看任务示例,我们重跑了一次因此任务示例有6个

可以多次继续重跑,在任务实例列表操作按钮还可以查看日志和下载日志

**本人博客网站 **IT小神 www.itxiaoshen.com

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章