从 1.3 到 3.x:表名重构、任务翻倍,Apache DolphinScheduler 核心架构深度剖析

从 1.3 版本到 3.X 版本,Apache DolphinScheduler 已经经历了数次迭代,有了不少变化,相信大家都注意到了。

本文将从表结构演进、任务类型扩展、注册中心多样化、架构设计优化和功能增强五个维度,系统对比 Apache DolphinScheduler 1.3 系列与 3.x 版本的核心差异,深入解析从 t_ds_process_definitiont_ds_workflow_definition表名重构从 12 种任务类型到 30+ 种的能力扩展、从单一 ZooKeeper 到多注册中心支持的架构演进,以及微内核插件架构、去中心化设计、容错机制和日志访问等关键技术升级,帮助读者全面理解 Apache DolphinScheduler 的架构演进路径和升级要点,有升级需要的用户尤其不要错过!

1. 系统架构概述

1.1 核心架构设计

DolphinScheduler 3.x 采用微内核 + 插件架构设计,所有核心能力(如任务、资源存储、注册中心等)都设计为扩展点,使用 SPI 提高系统的灵活性和可扩展性。

1.2 去中心化架构设计

DolphinScheduler 采用去中心化设计,Master 和 Worker 集群通过注册中心(ZooKeeper、JDBC 或 Etcd)实现无中心化特性。

  • MasterServer:主要负责 DAG 任务切分、任务提交监控,同时监控其他 MasterServer 和 WorkerServer 的健康状态
  • WorkerServer:主要负责任务执行和提供日志服务
  • 注册中心:支持 ZooKeeper、JDBC 和 Etcd 三种实现,用于集群管理和故障容错

2. 工作流总体存储结构(3.x 版本)

2.1 表结构演进

从 1.3 系列到 3.x 版本,DolphinScheduler 对核心表名进行了统一重命名,将 "process" 相关表名改为 "workflow" 相关表名,以更准确地反映工作流的概念。

1.3 版本表名 3.x 版本表名 说明
t_ds_process_definition t_ds_workflow_definition 工作流定义表
t_ds_process_definition_log t_ds_workflow_definition_log 工作流定义版本日志表
t_ds_process_instance t_ds_workflow_instance 工作流实例表
t_ds_process_task_relation t_ds_workflow_task_relation 工作流任务关系表
t_ds_process_task_relation_log t_ds_workflow_task_relation_log 工作流任务关系日志表

2.2 核心表结构详解

2.2.1 工作流定义表(t_ds_workflow_definition)

1

与 1.3 版本相比,3.x 版本的主要变化:

  • 使用 code 作为业务唯一标识,替代原来的 id
  • 新增 execution_type 字段,支持串行执行策略
  • 新增 warning_group_id 字段,关联告警组
  • 移除了 process_definition_json 字段,任务信息现在通过关联表存储

2.2.2 工作流数据模型关系

2

2.3 服务层核心接口

ProcessService 接口提供了工作流定义管理的核心方法:

方法 功能
saveWorkflowDefine() 保存工作流定义,支持版本控制
saveTaskDefine() 保存任务定义,支持版本控制
saveTaskRelation() 保存任务关系,构建 DAG 结构
genDagGraph() 从工作流定义生成 DAG 图
switchVersion() 切换工作流版本
findWorkflowDefinition() 查询工作流定义

3. 任务类型分类体系

3.1 任务类型架构

DolphinScheduler 3.x 将任务类型扩展到 30+ 种,并按照功能特性分为 5 大类:

3

3.2 任务类型对比(1.3 vs 3.x)

类别 1.3 版本 3.x 版本 新增类型
通用任务 SHELL, SQL, PYTHON, SPARK, FLINK, MR, HTTP + JAVA, GRPC, DINKY, FLINK_STREAM, HIVECLI, REMOTESHELL 6 种
云原生任务 - EMR, K8S, DMS, DATA_FACTORY, ALIYUN_SERVERLESS_SPARK 5 种
逻辑任务 CONDITIONS, SUB_PROCESS, DEPENDENT + SWITCH 1 种
数据集成 DATAX, SQOOP + SEATUNNEL 1 种
机器学习 - JUPYTER, MLFLOW, OPENMLDB, DVC, SAGEMAKER, PYTORCH, KUBEFLOW 7 种
其他任务 - ZEPPELIN, CHUNJUN, DATASYNC, LINKIS 4 种

3.3 典型任务参数结构

3.3.1 通用任务参数结构

所有任务类型都支持以下通用参数:

4

3.3.2 Shell 任务参数示例

{
  "localParams": [],
  "resourceList": [
    {
      "id": 3,
      "name": "run.sh",
      "res": "run.sh"
    }
  ],
  "rawScript": "echo 'Hello from DolphinScheduler 3.x'",
  "conditionResult": {
    "successNode": [""],
    "failedNode": [""]
  }
}

3.3.3 SQL 任务参数示例

{
  "type": "MYSQL",
  "datasource": 1,
  "sql": "SELECT * FROM users WHERE id = ${id}",
  "udfs": "",
  "sqlType": "0",
  "sendEmail": false,
  "displayRows": 10,
  "preStatements": [],
  "postStatements": []
}

4. 核心架构流程

4.1 工作流执行流程

5

4.2 注册中心架构

DolphinScheduler 3.x 支持多种注册中心实现,包括 ZooKeeper、JDBC 和 Etcd,实现了真正的去中心化架构。

6

4.2.1 JDBC 注册中心

JDBC 注册中心使用关系数据库实现事件监听和分布式锁,适合已有数据库基础设施的环境。

核心特性:

  • 事件监听:通过 JdbcRegistryDataChangeListenerAdapter 监听数据库数据变化
  • 分布式锁:支持阻塞和超时两种锁获取方式
  • 心跳机制:通过心跳检测客户端存活状态,自动清理失效锁

配置示例:

registry:
  type: jdbc
  heartbeat-refresh-interval: 3s
  session-timeout: 60s
  hikari-config:
    jdbc-url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler
    username: root
    password: root
    maximum-pool-size: 5

4.2.2 Etcd 注册中心

Etcd 注册中心基于 Jetcd 客户端库实现,适合云原生环境。
核心特性:

  • Watch API:监听指定键或键前缀的变化
  • Lease 锁:基于 TTL 的租约机制,客户端断开时自动释放锁
  • 连接健康监控:通过 EtcdConnectionStateListener 跟踪连接状态

5. 容错设计

5.1 宕机容错机制

DolphinScheduler 的容错设计依赖于注册中心的 Watcher 机制,分为 Master 容错和 Worker 容错两种情况。

7

5.2 任务失败重试

任务失败重试、流程失败恢复和流程失败重跑是三个不同的概念:

类型 级别 触发方式 执行范围
任务失败重试 任务级别 系统自动 自动重试直到成功或超过重试次数
流程失败恢复 流程级别 手动触发 从失败节点或当前节点开始执行
流程失败重跑 流程级别 手动触发 从开始节点重新执行

任务节点分类:

  • 业务节点:Shell、SQL、Spark、Flink 等,支持失败重试
  • 逻辑节点:DEPENDENT、SUB_WORKFLOW、CONDITIONS 等,不支持失败重试

6. 任务优先级设计

DolphinScheduler 采用多级优先级设计,确保重要任务优先执行。

8

实现机制:

  • 流程实例优先级_流程实例id_任务优先级_任务id 信息保存到注册中心任务队列
  • 通过字符串比较获取最高优先级任务
  • 流程优先级和任务优先级各分为 5 级:HIGHEST、HIGH、MEDIUM、LOW、LOWEST

7. 日志访问机制

DolphinScheduler 3.x 使用 gRPC 实现远程日志访问,替代了早期的 Netty 实现。

9

Logback 配置关键点:

  • 使用 SiftingAppender 按任务 ID 分离日志文件
  • TaskLogFilter 过滤任务相关日志
  • TaskLogDiscriminator 根据 taskAppId 区分不同任务
  • SensitiveDataConverter 脱敏敏感数据

8. 系统模块架构

DolphinScheduler 由多个核心模块组成,各模块职责清晰:

10

9. MasterServer 内部核心组件

MasterServer 采用分布式无中心设计,内部包含多个核心线程和组件,协同完成工作流调度。

11

  • 组件详细说明
组件 职责 关键操作
DistributedQuartz 分布式调度组件 负责定时任务的启停操作,调起任务后由线程池处理后续操作
MasterSchedulerService 命令扫描线程 定时扫描 t_ds_command 表,根据不同命令类型执行业务操作
WorkflowExecuteRunnable 工作流执行线程 负责 DAG 任务切分、任务提交监控、各种事件类型的逻辑处理
TaskExecuteRunnable 任务执行线程 负责任务的处理和持久化,生成任务事件并提交到事件队列
EventExecuteService 事件执行服务 负责工作流实例事件队列的轮询
StateWheelExecuteThread 状态轮询线程 负责工作流和任务超时、任务重试、任务依赖的轮询
FailoverExecuteThread 容错执行线程 负责 Master 容错和 Worker 容错的相关逻辑

10. WorkerServer 内部核心组件

WorkerServer 同样采用分布式无中心设计,主要负责任务执行和日志服务。

12

  • 组件详细说明
组件 职责 关键操作
WorkerManagerThread 任务管理线程 不断从任务队列中领取任务,提交到线程池处理
TaskExecuteThread 任务执行线程 根据不同的任务类型进行任务的实际处理
RetryReportTaskStatusThread 重试报告线程 定时轮询向 Master 汇报任务状态,直到 Master 回复状态 ack

11. 启动流程活动图

DolphinScheduler 的工作流启动流程涉及多个组件的协同工作。

13

12. 去中心化 vs 中心化架构对比

DolphinScheduler 采用动态中心化的去中心化架构,与传统的中心化架构有显著区别。

14

13. 核心术语说明

理解 DolphinScheduler 需要掌握以下核心术语:

术语 说明
DAG 有向无环图,工作流中的任务以 DAG 形式组装
工作流定义 通过拖拽任务节点并建立关联形成的可视化 DAG
工作流实例 工作流定义的实例化,每次运行产生一个实例
任务实例 任务节点的实例化,标识某个具体任务的执行
调度方式 支持基于 cron 表达式的定时调度和手动调度
依赖 支持 DAG 简单依赖和任务依赖节点
补数 历史数据回填,支持区间并行和串行两种模式

14. 总结

DolphinScheduler 3.x 相比 1.3 系列版本,在架构和功能上都有显著提升:

架构演进:

  • 从单一 ZooKeeper 注册中心扩展到支持 ZooKeeper、JDBC、Etcd 多种实现
  • 从中心化架构演进到真正的去中心化架构
  • 采用微内核 + 插件架构,提高系统可扩展性

表结构优化:

  • 统一表名命名规范,从 process 改为 workflow
  • 引入 code 作为业务唯一标识
  • 新增 execution_type 支持多种执行策略
  • 任务信息从 JSON 字段迁移到关联表存储

功能增强:

  • 任务类型从 12 种扩展到 30+ 种
  • 新增云原生任务和机器学习任务支持
  • 增强容错机制和优先级设计
  • 日志访问从 Netty 升级到 gRPC

这些改进使 DolphinScheduler 成为一个更加现代化、可扩展、易维护的数据编排平台。

Notes

  • 补充内容基于 docs/docs/en/architecture/design.mddocs/docs/zh/architecture/design.md 文档
  • MasterServer 和 WorkerServer 的内部组件设计体现了系统的模块化和职责分离
  • 去中心化架构通过注册中心实现动态选举,避免了单点故障问题
  • 建议参考架构设计文档了解更多实现细节
posted @ 2026-07-29 17:51  海豚调度  阅读(18)  评论(0)    收藏  举报