从 1.3 到 3.x:表名重构、任务翻倍,Apache DolphinScheduler 核心架构深度剖析
从 1.3 版本到 3.X 版本,Apache DolphinScheduler 已经经历了数次迭代,有了不少变化,相信大家都注意到了。
本文将从表结构演进、任务类型扩展、注册中心多样化、架构设计优化和功能增强五个维度,系统对比 Apache DolphinScheduler 1.3 系列与 3.x 版本的核心差异,深入解析从 t_ds_process_definition 到 t_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.3 版本相比,3.x 版本的主要变化:
- 使用
code作为业务唯一标识,替代原来的id - 新增
execution_type字段,支持串行执行策略 - 新增
warning_group_id字段,关联告警组 - 移除了
process_definition_json字段,任务信息现在通过关联表存储
2.2.2 工作流数据模型关系

2.3 服务层核心接口
ProcessService 接口提供了工作流定义管理的核心方法:
| 方法 | 功能 |
|---|---|
saveWorkflowDefine() |
保存工作流定义,支持版本控制 |
saveTaskDefine() |
保存任务定义,支持版本控制 |
saveTaskRelation() |
保存任务关系,构建 DAG 结构 |
genDagGraph() |
从工作流定义生成 DAG 图 |
switchVersion() |
切换工作流版本 |
findWorkflowDefinition() |
查询工作流定义 |
3. 任务类型分类体系
3.1 任务类型架构
DolphinScheduler 3.x 将任务类型扩展到 30+ 种,并按照功能特性分为 5 大类:

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 通用任务参数结构
所有任务类型都支持以下通用参数:

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 工作流执行流程

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

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 容错两种情况。

5.2 任务失败重试
任务失败重试、流程失败恢复和流程失败重跑是三个不同的概念:
| 类型 | 级别 | 触发方式 | 执行范围 |
|---|---|---|---|
| 任务失败重试 | 任务级别 | 系统自动 | 自动重试直到成功或超过重试次数 |
| 流程失败恢复 | 流程级别 | 手动触发 | 从失败节点或当前节点开始执行 |
| 流程失败重跑 | 流程级别 | 手动触发 | 从开始节点重新执行 |
任务节点分类:
- 业务节点:Shell、SQL、Spark、Flink 等,支持失败重试
- 逻辑节点:DEPENDENT、SUB_WORKFLOW、CONDITIONS 等,不支持失败重试
6. 任务优先级设计
DolphinScheduler 采用多级优先级设计,确保重要任务优先执行。

实现机制:
- 将
流程实例优先级_流程实例id_任务优先级_任务id信息保存到注册中心任务队列 - 通过字符串比较获取最高优先级任务
- 流程优先级和任务优先级各分为 5 级:HIGHEST、HIGH、MEDIUM、LOW、LOWEST
7. 日志访问机制
DolphinScheduler 3.x 使用 gRPC 实现远程日志访问,替代了早期的 Netty 实现。

Logback 配置关键点:
- 使用
SiftingAppender按任务 ID 分离日志文件 TaskLogFilter过滤任务相关日志TaskLogDiscriminator根据taskAppId区分不同任务SensitiveDataConverter脱敏敏感数据
8. 系统模块架构
DolphinScheduler 由多个核心模块组成,各模块职责清晰:

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

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

- 组件详细说明
| 组件 | 职责 | 关键操作 |
|---|---|---|
| WorkerManagerThread | 任务管理线程 | 不断从任务队列中领取任务,提交到线程池处理 |
| TaskExecuteThread | 任务执行线程 | 根据不同的任务类型进行任务的实际处理 |
| RetryReportTaskStatusThread | 重试报告线程 | 定时轮询向 Master 汇报任务状态,直到 Master 回复状态 ack |
11. 启动流程活动图
DolphinScheduler 的工作流启动流程涉及多个组件的协同工作。

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

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.md和docs/docs/zh/architecture/design.md文档 - MasterServer 和 WorkerServer 的内部组件设计体现了系统的模块化和职责分离
- 去中心化架构通过注册中心实现动态选举,避免了单点故障问题
- 建议参考架构设计文档了解更多实现细节
浙公网安备 33010602011771号