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

背景问题

前段时间在公司接触大数据平台,顺便了解了一下调度系统的实现。发现现在用 DolphinScheduler 的团队挺多,号称分布式、可视化、高可用。就想深入扒一扒,这玩意儿到底好在哪,跟 Airflow、XXL-Job 这些有啥区别。

这篇文章就是想搞清楚几个问题:

  • DolphinScheduler 到底支持哪些任务类型?
  • 它的架构是怎么设计的?怎么做到高可用的?
  • 一个工作流从提交到执行完成,中间经历了什么?
  • 跟其他调度工具比,有啥优缺点?

一、支持的任务类型

DolphinScheduler 支持的任务类型挺多的,核心思想是所有任务都通过插件实现,不用自己写代码,Web UI 上点点配置就能跑。

1. 大数据计算类任务

Spark/Flink/MapReduce

这类任务的原理很简单:插件帮你拼命令。

比如 Spark 任务,你在 Web UI 上配置:

  • JAR 包路径(HDFS 或本地)
  • 主类名
  • 资源参数(executor 数量、内存大小)
  • 运行模式(YARN/K8s/本地)

插件拿到这些配置后,自动拼接成 spark-submit 命令,然后提交到集群执行。

1
2
3
4
5
6
7
8
9
# 插件自动生成的命令示例
spark-submit \
--master yarn \
--deploy-mode cluster \
--executor-memory 4G \
--executor-cores 2 \
--num-executors 10 \
--class com.example.WordCount \
hdfs:///path/to/job.jar input output

Hive/Spark SQL

更直接,内置 SQL 编辑器,写完 SQL 点运行就行。插件会连接到 Hive Metastore 或 Spark Thrift Server,执行 SQL 并返回结果。支持查看结果集、失败重跑。

2. 脚本/命令类任务

Shell/Python/Perl

有两种方式:

  1. 直接在 Web UI 写脚本内容
  2. 配置脚本文件路径(本地文件系统或 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 做集群协调、节点选举和状态存储。

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. 任务调度与执行流程

详细步骤

  1. 触发调度:工作流满足触发条件(定时/手动/上游依赖触发),Master 从数据库读取工作流信息,解析 DAG 图并生成任务执行计划。

  2. 任务分配:Master 根据任务分片策略(按 Worker 负载/指定执行节点/随机),将任务发送至对应 Worker 节点,通过 ZooKeeper 发送任务执行指令。

  3. 任务执行:Worker 接收指令,加载对应的任务插件,初始化执行环境,执行插件逻辑(如拼接 spark-submit 命令、运行 Shell 脚本)。实时将执行日志和状态上报至 Master。

  4. 依赖推进:当一个任务执行完成后,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 是个不错的选择。


延伸阅读