• Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上


    概述

    定义

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

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

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

    image-20220727175127097

    特性

    • 高可靠性:去中心化的多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
    

    image-20220728152454183

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

    sh tools/bin/upgrade-schema.sh
    

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

    image-20220728135340947

    启动 DolphinScheduler

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

    sh ./bin/install.sh
    

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

    image-20220728153317480

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

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

    image-20220728154627476

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

    # 一键停止集群所有服务
    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、内存和平均负载

    image-20220729134239869

    安全中心

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

    添加租户

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

    image-20220728162027867

    添加用户

    • 用户分为管理员用户普通用户
      • 管理员有授权和用户管理等权限,没有创建项目和工作流定义的操作的权限。
      • 普通用户可以创建项目和对工作流定义的创建,编辑,执行等操作。
      • 注意:如果该用户切换了租户,则该用户所在租户下所有资源将复制到切换的新租户下。
    • 编辑用户信息
      • 普通用户登录后,点击用户名下拉框中的用户信息,进入用户信息页面,点击"编辑"按钮,编辑用户信息。
    • 修改用户密码
      • 普通用户登录后,点击用户名下拉框中的用户信息,进入修改密码页面,输入密码并确认密码后点击"编辑"按钮,则修改密码成功。

    image-20220728162145296

    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
    

    image-20220729172722999

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

    image-20220729134527389

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

    项目管理

    项目列表

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

    image-20220729173750904

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

    工作流定义

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

    image-20220729180646947

    • 添加 Shell 任务的参数设置:
      1. 填写“节点名称”,“描述”,“脚本”字段;
      2. “运行标志”勾选“正常”,若勾选“禁止执行”,运行工作流不会执行该任务;
      3. 选择“任务优先级”:当 worker 线程数不足时,级别高的任务在执行队列中会优先执行,相同优先级的任务按照先进先出的顺序执行;
      4. 超时告警(非必选):勾选超时告警、超时失败,填写“超时时长”,当任务执行时间超过超时时长,会发送告警邮件并且任务超时失败;
      5. 资源(非必选)。资源文件是资源中心->文件管理页面创建或上传的文件,如文件名为 test.sh,脚本中调用资源命令为 sh test.sh
      6. 自定义参数(非必填);
      7. 点击"确认添加"按钮,保存任务设置。

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

    image-20220729181038295

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

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

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

    image-20220729182424363

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

    image-20220729181830766

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

    image-20220729182759854

    查看任务定义

    image-20220729182920332

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

    image-20220729182945874

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

    image-20220729235431354

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

  • 相关阅读:
    ESP8266智能家居(3)——单片机数据发送到mqtt服务器
    休闲零食混战:三只松鼠“守淘”,良品铺子“攻抖”
    Statistical Hypothesis Testing
    LeetCode59.螺旋矩阵
    Matlab之四阶龙格—库塔法方法:解常微分初值问题
    UEFI 源码学习4.1 - PciHostBridgeDxe
    serverless开发实战
    nuc980学习笔记6 - 手把手教 源码编译和YAFFS2文件系统制作
    GO编译时避免引入外部动态库的解决方法
    JavaWeb:Maven常识性总结
  • 原文地址:https://www.cnblogs.com/itxiaoshen/p/16534082.html