DolphinScheduler 核心能力与运行机制深度解析

DolphinScheduler 核心能力与运行机制深度解析
XR背景问题
前段时间在公司接触大数据平台,顺便了解了一下调度系统的实现。发现现在用 DolphinScheduler 的团队挺多,号称分布式、可视化、高可用。就想深入扒一扒,这玩意儿到底好在哪,跟 Airflow、XXL-Job 这些有啥区别。
这篇文章就是想搞清楚几个问题:
- DolphinScheduler 到底支持哪些任务类型?
- 它的架构是怎么设计的?怎么做到高可用的?
- 一个工作流从提交到执行完成,中间经历了什么?
- 跟其他调度工具比,有啥优缺点?
一、支持的任务类型
DolphinScheduler 支持的任务类型挺多的,核心思想是所有任务都通过插件实现,不用自己写代码,Web UI 上点点配置就能跑。
1. 大数据计算类任务
Spark/Flink/MapReduce
这类任务的原理很简单:插件帮你拼命令。
比如 Spark 任务,你在 Web UI 上配置:
- JAR 包路径(HDFS 或本地)
- 主类名
- 资源参数(executor 数量、内存大小)
- 运行模式(YARN/K8s/本地)
插件拿到这些配置后,自动拼接成 spark-submit 命令,然后提交到集群执行。
1 | # 插件自动生成的命令示例 |
Hive/Spark SQL
更直接,内置 SQL 编辑器,写完 SQL 点运行就行。插件会连接到 Hive Metastore 或 Spark Thrift Server,执行 SQL 并返回结果。支持查看结果集、失败重跑。
2. 脚本/命令类任务
Shell/Python/Perl
有两种方式:
- 直接在 Web UI 写脚本内容
- 配置脚本文件路径(本地文件系统或 HDFS)
插件会在 Worker 节点上启动进程执行脚本,支持自定义环境变量和执行用户。
HTTP/SSH
- HTTP 任务:配置 URL、请求方法(GET/POST)、参数、请求头,插件发起网络请求并校验响应码
- SSH 任务:基于 SSH 协议远程连接服务器,执行指定命令或脚本,支持无密登录
3. 数据同步/存储类任务
DataX/Sqoop
封装了数据同步工具的原生命令。配置源端和目标端的数据源信息、同步规则,插件自动触发同步任务,支持进度监控。
HDFS/FTP/S3
支持文件操作:上传、下载、移动、删除。配置文件路径和操作类型就行,适配主流分布式文件系统和对象存储。
4. 调度/控制类任务
子工作流
可以把已创建的工作流作为子节点嵌入主工作流,实现模块化复用。这个功能挺实用的,比如把通用的数据预处理流程做成子工作流,多个主流程复用。
等待/判定/分支
- 等待任务:固定时长延迟
- 判定任务:基于参数或执行结果做条件判断
- 分支任务:支持并行、串行、依赖触发
5. 第三方集成类任务
Zeppelin/Jupyter
通过插件调用第三方服务的 REST API,远程触发交互式笔记执行。
XXL-Job/Airflow
支持通过 API 与其他调度系统集成,实现跨系统的任务编排和能力互补。
核心共性:所有任务都是”无代码可视化配置”,插件层屏蔽了底层执行细节,用户只管业务参数。
二、核心运行架构
DolphinScheduler 采用分布式主从架构,分为 4 大核心组件,底层依赖 ZooKeeper 做集群协调、节点选举和状态存储。
flowchart TB
UI[Web UI<br/>前端界面]
subgraph Master["Master Server 集群"]
M1[Master 1]
M2[Master 2]
M3[Master 3]
end
subgraph Worker["Worker Server 集群"]
W1[Worker 1]
W2[Worker 2]
W3[Worker 3]
end
ZK[ZooKeeper<br/>集群协调]
DB[(元数据数据库<br/>MySQL/PG)]
UI --> Master
Master --> Worker
Master --> ZK
Worker --> ZK
Master --> DB
Worker --> DB
style Master fill:#e1f5ff
style Worker fill:#fff4e1
style ZK fill:#ffe1e1
style DB fill:#e1ffe1
1. Master Server(主节点)
核心职责:
- 工作流解析
- 任务调度分配
- 集群节点管理
- 任务状态监控
运行逻辑:
接收 Web UI 提交的工作流,解析 DAG 图并拆分任务。根据任务类型、资源负载,将任务分配到空闲的 Worker 节点。实时监控 Worker 和任务状态,处理失败、超时等异常。
Master 支持集群部署,避免单点故障。ZooKeeper 负责主节点选举,一个 Master 挂了,别的 Master 会自动接管。
2. Worker Server(工作节点)
核心职责:
- 任务实际执行
- 日志收集
- 执行结果上报
运行逻辑:
接收 Master 分配的任务,加载对应的任务插件,执行插件封装的命令或逻辑。执行过程中实时收集日志并写入日志存储(本地或 ELK)。任务完成后将执行结果(成功/失败/终止)上报至 Master。
Worker 也支持集群部署,可以横向扩容。每个 Worker 向 ZooKeeper 注册,Master 通过 ZooKeeper 发现可用的 Worker。
3. ZooKeeper 集群
核心作用:
- Master/Worker 节点注册与发现
- 主节点选举
- 任务执行锁(防止并发执行冲突)
- 节点状态同步
ZooKeeper 在这个架构里扮演协调者的角色,确保分布式环境下的数据一致性。
4. 元数据数据库(MySQL/PostgreSQL)
存储内容:
- 工作流 DAG 定义
- 任务配置信息
- 调度规则(定时/依赖)
- 执行日志
- 任务/工作流运行状态
- 集群节点信息
数据库只存元数据和运行状态,不存实际的任务日志。日志单独存储,避免数据库膨胀。
三、工作流执行流程
一个工作流从提交到执行完成,整个过程挺清晰的。
1. 工作流编排与提交
前端 Web UI 提供拖拽式 DAG 编辑器。把左侧任务节点拖入画布,通过箭头连接节点设置依赖关系(串行/并行/条件依赖)。配置每个节点的业务参数和调度属性(超时时间、失败重跑次数、执行用户)。
提交后,工作流 DAG 定义、任务配置等元数据持久化到数据库,ZooKeeper 注册工作流信息。
2. 任务调度与执行流程
sequenceDiagram
participant UI as Web UI
participant Master as Master Server
participant ZK as ZooKeeper
participant Worker as Worker Server
participant DB as 数据库
UI->>Master: 提交工作流
Master->>DB: 读取工作流定义
Master->>Master: 解析DAG,生成执行计划
Master->>ZK: 查询可用Worker节点
loop 遍历任务
Master->>Worker: 分配任务
Worker->>Worker: 加载插件,执行任务
Worker->>Master: 实时上报状态和日志
Worker->>Master: 上报执行结果
alt 任务成功
Master->>Master: 触发下游任务
else 任务失败
Master->>Master: 处理失败重跑或终止
end
end
Master->>DB: 更新工作流状态
Master->>UI: 返回执行结果
详细步骤:
触发调度:工作流满足触发条件(定时/手动/上游依赖触发),Master 从数据库读取工作流信息,解析 DAG 图并生成任务执行计划。
任务分配:Master 根据任务分片策略(按 Worker 负载/指定执行节点/随机),将任务发送至对应 Worker 节点,通过 ZooKeeper 发送任务执行指令。
任务执行:Worker 接收指令,加载对应的任务插件,初始化执行环境,执行插件逻辑(如拼接
spark-submit命令、运行 Shell 脚本)。实时将执行日志和状态上报至 Master。依赖推进:当一个任务执行完成后,Master 更新任务状态,解析 DAG 图触发下游依赖任务。重复上述分配-执行流程,直至整个工作流所有任务执行完成。
3. 任务异常处理
失败重跑:支持任务级/工作流级重跑,可指定重跑节点(跳过已成功节点)。Master 重新分配重跑任务至 Worker。
超时终止:配置任务/工作流超时时间,超时后 Master 自动发送终止指令,Worker 停止任务进程并标记状态为超时失败。
节点故障:
- Worker 节点故障:Master 通过 ZooKeeper 检测到节点离线,将该节点上未完成的任务重新分配至其他空闲 Worker
- Master 节点故障:ZooKeeper 自动选举新的 Master,接管所有调度任务,无任务丢失
四、核心设计亮点
1. 可视化 DAG 编排
不用写代码,拖拽就能完成复杂工作流设计。支持 DAG 图放大、缩小、保存、导出,直观展示任务依赖关系。这个对非技术人员很友好,降低了使用门槛。
2. 分布式高可用
Master/Worker 均支持集群部署,无单点故障。可根据业务负载横向扩容节点。Master 节点故障时,ZooKeeper 会自动选举新的 Master 接管调度任务,整个过程秒级完成,业务无感知。
3. 插件化架构
所有任务类型都基于插件实现,新增任务类型只需开发自定义插件,无需修改核心代码。扩展性强,社区也贡献了不少第三方插件。
4. 全链路监控
支持工作流/任务级别的状态监控(待执行/运行中/成功/失败/超时),实时查看执行日志,支持日志检索、下载。排查问题时方便,不用上服务器翻日志文件。
5. 资源管理
支持配置任务执行的资源队列(YARN 队列)、执行节点组,实现任务资源隔离,避免资源抢占。这个在生产环境挺重要,防止核心任务被抢资源。
五、与其他调度工具的对比
对比 Airflow
Airflow 需要编写 Python DAG 代码,学习曲线陡峭。DolphinScheduler 全程可视化操作,门槛更低。
国内大数据生态适配方面,DolphinScheduler 对 Hive/Spark/Flink 的原生支持更友好。Airflow 虽然也能做,但配置起来麻烦。
对比 XXL-Job
XXL-Job 更偏向轻量级单机任务调度,适合常规后台任务。DolphinScheduler 专注于大数据工作流调度,支持复杂 DAG 编排和多任务类型集成。
如果只是简单的定时任务,XXL-Job 够用。但要处理复杂的大数据任务依赖,DolphinScheduler 更合适。
对比 Oozie
Oozie 是 Hadoop 生态的老牌调度系统,但配置全是 XML,维护起来头大。DolphinScheduler 摆脱了 XML 配置,可视化操作更高效。
分布式架构上,DolphinScheduler 支持更大规模的任务调度,且部署维护更简单。Oozie 的架构相对老旧,扩展性不如 DolphinScheduler。
总结
DolphinScheduler 在国内大数据调度领域用得挺多,不是没道理的:
- 上手简单:可视化 DAG 编程,不用写代码
- 功能全面:支持各类大数据任务、脚本任务、数据同步
- 稳定可靠:分布式架构,Master/Worker 均支持集群部署,无单点故障
- 扩展性强:插件化架构,自定义任务类型只需开发插件
- 国内生态友好:对 Hive/Spark/Flink 的支持比 Airflow 更好
当然也有不足,比如社区文档不如 Airflow 完善,第三方生态相对小。但对于国内团队来说,DolphinScheduler 是个不错的选择。
延伸阅读:
- DolphinScheduler 官方文档
- Apache Airflow 官方文档
- XXL-Job GitHub 仓库







