先说结论:如果你手里攒了一堆定时跑批的活,不管是SQL脚本、Shell任务还是Spark/Flink任务,正缺一个能把它们统一管起来、能看依赖、能告警、能补数的平台,那DolphinScheduler大概是现阶段性价比最高的选择之一。我去年把一个部门七八台机器上的crontab全部迁到了DolphinScheduler上,从部署到上线跑完第一个工作流,前后大概花了一个周末,之后维护成本直线下降。这篇文章就把这套实践过程完整记录下来,覆盖部署、建工作流、配置告警、参数传递、踩坑排错,需要的朋友可以直接照着抄。
1. 调度系统选型与整体设计思路
1.1 为什么最终选了DolphinScheduler
先说说为什么不是其他方案。当时团队里跑批脚本的现状是这样的:每个数据开发各写各的crontab,时间规则自己定,脚本散落在不同机器上,依赖关系全靠口头约定。最痛的一次是凌晨2点A任务挂了,B任务看不到任何感知,照样到点跑,结果下游报表数据缺了一大块,第二天早上业务方找过来才知道出了问题。
这种场景下,我要的不是一个能"定时执行命令"的工具,而是一个能把所有任务收拢起来、画清楚依赖关系、出事能自动告警、事后能补数的调度平台。市面上的开源方案对比了一圈:
- Airflow:调度能力很强,DAG表达丰富,但Python技术栈在团队里推广成本高,而且安装部署、底层元数据库维护都不算省心。
- xxl-job:轻量,适合单任务秒级调度,但对"工作流"这种带依赖关系、带DAG编排的场景支持偏弱,更多是单点任务调度。
- 自研调度器:想清楚就知道不合适,调度平台的难点从来不是"定时触发",而是高可用、失败重试、分布式执行、日志收集、权限隔离,这些自己写轮子没有几个月下不来。
DolphinScheduler的切入点刚好卡在中间:它能编排DAG工作流,支持Shell、SQL、Spark、Flink、HTTP等丰富任务类型,后端用ZooKeeper做分布式协调,天然支持集群模式扩展,部署方式也灵活,单机可以跑,集群也能扛住生产压力。而且它对Java技术栈团队非常友好,后端、前端都有完整的管理界面,开发同学不需要学Python,只需要在页面上拖拖拽拽,学习成本比Airflow低很多。
1.2 核心概念:工作流、任务、租户、队列
想把DolphinScheduler用明白,先要把几个核心概念搞清楚,这些概念在前端界面上反复出现,理解了之后整个系统就通了大半。
工作流定义:可以理解为一张流程图,把多个任务节点用连线串起来。比如"数据同步"任务完成后执行"数据清洗",清洗完再触发"指标计算",这就是一个包含三个节点的工作流。工作流定义是一等公民,可以配置定时调度,也可以手动触发。
任务节点:工作流里的每一个环节。DolphinScheduler内置了非常多的任务类型,常见的有Shell、SQL、存储过程、HTTP、Spark、Flink、Python、数据同步(DataX)等。任务节点之间可以设置依赖关系,A节点成功后才允许B节点启动,也可以设条件分支,根据上游的输出决定走哪条分支。
租户:这是DolphinScheduler里一个容易被新手忽略但很重要的概念。租户对应操作系统里的一个Linux用户。Worker节点执行任务时,会以这个租户身份去执行Shell命令,脚本里产生的文件、日志的属主都是这个租户。换句话说,租户就是任务运行时的"身份",它决定了任务能访问哪些操作系统资源、文件权限边界在哪里。集群部署时,租户对应的系统用户必须在每台Worker机器上都存在,否则任务会报错。
队列:队列对应的是资源队列,在数值计算场景下一般指Yarn队列。如果你的任务要提交到Yarn上跑Spark或者Flink,需要指定队列名,用来做资源隔离和配额管理。如果只是跑Shell、SQL这类轻量任务,队列不是必须的。
1.3 整体架构与核心组件
DolphinScheduler的实际部署会拆成几个关键服务,理解它们各司其职,后面排查问题会快很多:
- MasterServer:工作流的大脑,负责任务调度、工作流实例的启动、停止、故障转移。它会从ZooKeeper上监听Worker的注册状态,把要执行的任务分配给合适的Worker。
- WorkerServer:真正干活的节点,负责执行任务,把执行日志写回数据库/文件系统。可以横向扩展,多台Worker天然负载均衡。
- ApiServer:后端接口服务,前端页面所有操作最终都调它,也负责把任务定义、调度信息持久化到数据库。
- AlertServer:告警服务,监听数据库里的告警事件,对接邮件、Webhook、钉钉等渠道。
- ZooKeeper:分布式协调器,Master和Worker通过ZK做选举、心跳、注册发现,是集群高可用的基石。
- 数据库:核心元数据存储,存工作流定义、任务实例、调度时间、告警记录等所有业务数据。
单机部署时这些服务都跑在一台机器上,但架构和集群模式完全一致,后续要扩机器,只需要加Worker节点就行,非常平滑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单机部署完整过程
2.1 环境准备
我用的是DolphinScheduler 3.2.x版本,对应JDK要求是1.8+,数据库支持MySQL和PostgreSQL,我选了MySQL 8.0。操作系统是CentOS 7.9。先确认Java环境:
bash复制java -version
# openjdk version "1.8.0_362"
如果没有安装JDK,直接用yum装一个:
bash复制yum install -y java-1.8.0-openjdk.x86_64
接着下载安装包。从官方
