
拖拽式编排ETL!DolphinScheduler玩转大数据调度
前言
在大数据、数据仓库、数据中台体系里,最让人头疼的从来不只是 Spark、Flink、Hive 怎么写,而是:
- 几十个任务之间有依赖关系,如何保证顺序执行?
- 任务失败了要自动重试、告警、甚至走分支流程?
- 多团队、多业务、多集群,如何做权限隔离?
- 凌晨跑批失败,如何快速定位哪一步卡住?
如果你还在用:
- Linux Crontab 串联
- Shell 脚本互相调用
- 自己写代码控制依赖
- XXL-JOB 硬写 ETL 流程
那一定会遇到:脚本爆炸、依赖混乱、运维成本极高、出问题通宵救火。
今天这篇文章,就带你彻底吃透 Apache DolphinScheduler——大数据领域公认的 可视化 DAG 调度神器,真正做到:
拖拽画图 = 生成 ETL 流程,让数据平台从“手工作坊”升级为“工业化流水线”。
一、DolphinScheduler 核心定位:大数据场景的工作流编排
一句话定位:
Apache DolphinScheduler 是一个分布式、易扩展、可视化的大数据工作流调度平台,专为 ETL、离线计算、复杂依赖而生。
它和我们前面讲的 XXL-JOB、PowerJob、Elastic-Job 完全不是一个赛道:
| XXL-JOB | 通用分布式定时任务 | 订单、报表、定时任务 | 后端业务开发、中小团队 |
| PowerJob | 分布式调度 + 简单 DAG | 业务任务 + 少量依赖 | 全栈团队、微服务 |
| Elastic-Job | 海量分片批处理 | 数据分片、高并发计算 | 高并发业务系统 |
| DolphinScheduler | 大数据工作流调度 | ETL、数仓、离线计算、复杂DAG | 数据平台、数仓工程师、大数据团队 |
1.1 核心解决的真实痛点
一个标准数仓流程:
抽 ODS → 洗 DWD → 算 DWS → 建 ADS → 推报表 → 同步业务库
手工维护依赖完全不可行。
看不到任务执行状态、不知道哪一步卡住、不知道上下游影响范围。
多租户、权限、队列、告警、容错、补数据、回溯,这些大数据平台刚需必须自带。
一套平台调度:
- SQL(MySQL、PostgreSQL、Hive)
- Spark、Flink
- MR、Shell、Python、Procedure
- 数据质量检查
1.2 核心架构总览
DolphinScheduler 采用典型分布式架构,分为:
- Master:调度决策、DAG 切分、任务分发
- Worker:真正执行任务
- DB:存储元数据(MySQL/PostgreSQL)
- UI:前端控制台(React)
用 Mermaid 画一张最清晰的架构图:
#mermaid-svg-uXQWBHsMdPX0vBm2{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uXQWBHsMdPX0vBm2 .error-icon{fill:#552222;}#mermaid-svg-uXQWBHsMdPX0vBm2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uXQWBHsMdPX0vBm2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .marker.cross{stroke:#333333;}#mermaid-svg-uXQWBHsMdPX0vBm2 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uXQWBHsMdPX0vBm2 p{margin:0;}#mermaid-svg-uXQWBHsMdPX0vBm2 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster-label text{fill:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster-label span{color:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster-label span p{background-color:transparent;}#mermaid-svg-uXQWBHsMdPX0vBm2 .label text,#mermaid-svg-uXQWBHsMdPX0vBm2 span{fill:#333;color:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .node rect,#mermaid-svg-uXQWBHsMdPX0vBm2 .node circle,#mermaid-svg-uXQWBHsMdPX0vBm2 .node ellipse,#mermaid-svg-uXQWBHsMdPX0vBm2 .node polygon,#mermaid-svg-uXQWBHsMdPX0vBm2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .rough-node .label text,#mermaid-svg-uXQWBHsMdPX0vBm2 .node .label text,#mermaid-svg-uXQWBHsMdPX0vBm2 .image-shape .label,#mermaid-svg-uXQWBHsMdPX0vBm2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-uXQWBHsMdPX0vBm2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .rough-node .label,#mermaid-svg-uXQWBHsMdPX0vBm2 .node .label,#mermaid-svg-uXQWBHsMdPX0vBm2 .image-shape .label,#mermaid-svg-uXQWBHsMdPX0vBm2 .icon-shape .label{text-align:center;}#mermaid-svg-uXQWBHsMdPX0vBm2 .node.clickable{cursor:pointer;}#mermaid-svg-uXQWBHsMdPX0vBm2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .arrowheadPath{fill:#333333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uXQWBHsMdPX0vBm2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uXQWBHsMdPX0vBm2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uXQWBHsMdPX0vBm2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster text{fill:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 .cluster span{color:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uXQWBHsMdPX0vBm2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uXQWBHsMdPX0vBm2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-uXQWBHsMdPX0vBm2 .icon-shape,#mermaid-svg-uXQWBHsMdPX0vBm2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uXQWBHsMdPX0vBm2 .icon-shape p,#mermaid-svg-uXQWBHsMdPX0vBm2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uXQWBHsMdPX0vBm2 .icon-shape rect,#mermaid-svg-uXQWBHsMdPX0vBm2 .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uXQWBHsMdPX0vBm2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uXQWBHsMdPX0vBm2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uXQWBHsMdPX0vBm2 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
操作/查看
分发任务
元数据/状态
执行
日志/结果
邮件/钉钉/短信
Web UI 控制台
Master 调度集群
Worker 执行集群
MySQL/PG
Spark/Flink/Hive/MySQL
告警模块
这张图是理解 DolphinScheduler 的关键:
Master 只负责“调度”,Worker 只负责“执行”,架构无单点,可水平扩展。
二、部署与基础配置:多租户、权限管理
2.1 生产部署模式(标准架构)
生产环境必须使用:
- 3 个 Master 节点(高可用)
- 多个 Worker 节点(按业务队列分组)
- MySQL 主从 / RDS
- 独立的报警服务、日志服务
2.2 快速启动(Docker 演示)
为了让你快速上手,这里给出 Docker Compose 一键部署脚本:
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dolphinscheduler
ports:
– "3306:3306"
networks:
– ds–net
dolphinscheduler:
image: apache/dolphinscheduler–standalone–server:3.2.1
ports:
– "12345:12345"
– "25333:25333"
environment:
– DATABASE_HOST=mysql
– DATABASE_USERNAME=root
– DATABASE_PASSWORD=root
– DATABASE_PORT=3306
depends_on:
– mysql
networks:
– ds–net
networks:
ds-net:
启动:
docker-compose up -d
访问:
http://localhost:12345/dolphinscheduler/ui
账号:admin
密码:dolphinscheduler123
2.3 核心配置:多租户
DolphinScheduler 最强大的企业级特性之一就是 多租户。
什么是多租户?
- 不同业务线(电商、物流、支付)
- 不同团队(数据组、算法组、业务组)
- 不同环境(测试、预发、生产)
共用一套 DolphinScheduler 集群,但数据、权限、资源、队列完全隔离。
租户配置路径
安全中心 → 租户管理 → 创建租户
每个租户可以绑定:
- Linux 执行用户(Worker 上的账号)
- 队列资源(Yarn 队列)
- 权限范围
- 告警组
2.4 权限体系(企业级必备)
DolphinScheduler 权限设计非常严谨,支持:
- 用户管理
- 租户管理
- 项目权限
- 资源权限
- 文件管理权限
- 告警权限
典型生产权限结构:
管理员 → 项目管理员 → 开发 → 访客
- 开发:只能看、只能运行自己的流程
- 项目管理员:可编辑、可上线、可配置
- 管理员:全局配置、集群管理
这对大数据平台合规、审计、安全至关重要。
三、可视化实操:拖拽式构建 ETL 流程(抽数→清洗→计算→入库)
这一章是全文最硬核、最实战的部分,我会带你从零拖拽一个标准数仓 ETL 流程:
业务流程(真实生产):
3.1 创建项目
项目管理 → 创建项目 → 订单数仓项目
3.2 创建工作流 DAG
进入项目 → 工作流定义 → 创建工作流
你会看到一个完全可视化的画布:
- 左边是任务节点
- 中间是画布
- 右边是属性配置
3.3 拖拽构建 ETL 流程
我直接给出最终 DAG 结构(Mermaid 便于你理解):
#mermaid-svg-B8lDsccJphKfghEf{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B8lDsccJphKfghEf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B8lDsccJphKfghEf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B8lDsccJphKfghEf .error-icon{fill:#552222;}#mermaid-svg-B8lDsccJphKfghEf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B8lDsccJphKfghEf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B8lDsccJphKfghEf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B8lDsccJphKfghEf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B8lDsccJphKfghEf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B8lDsccJphKfghEf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B8lDsccJphKfghEf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B8lDsccJphKfghEf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B8lDsccJphKfghEf .marker.cross{stroke:#333333;}#mermaid-svg-B8lDsccJphKfghEf svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B8lDsccJphKfghEf p{margin:0;}#mermaid-svg-B8lDsccJphKfghEf .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-B8lDsccJphKfghEf .cluster-label text{fill:#333;}#mermaid-svg-B8lDsccJphKfghEf .cluster-label span{color:#333;}#mermaid-svg-B8lDsccJphKfghEf .cluster-label span p{background-color:transparent;}#mermaid-svg-B8lDsccJphKfghEf .label text,#mermaid-svg-B8lDsccJphKfghEf span{fill:#333;color:#333;}#mermaid-svg-B8lDsccJphKfghEf .node rect,#mermaid-svg-B8lDsccJphKfghEf .node circle,#mermaid-svg-B8lDsccJphKfghEf .node ellipse,#mermaid-svg-B8lDsccJphKfghEf .node polygon,#mermaid-svg-B8lDsccJphKfghEf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B8lDsccJphKfghEf .rough-node .label text,#mermaid-svg-B8lDsccJphKfghEf .node .label text,#mermaid-svg-B8lDsccJphKfghEf .image-shape .label,#mermaid-svg-B8lDsccJphKfghEf .icon-shape .label{text-anchor:middle;}#mermaid-svg-B8lDsccJphKfghEf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B8lDsccJphKfghEf .rough-node .label,#mermaid-svg-B8lDsccJphKfghEf .node .label,#mermaid-svg-B8lDsccJphKfghEf .image-shape .label,#mermaid-svg-B8lDsccJphKfghEf .icon-shape .label{text-align:center;}#mermaid-svg-B8lDsccJphKfghEf .node.clickable{cursor:pointer;}#mermaid-svg-B8lDsccJphKfghEf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B8lDsccJphKfghEf .arrowheadPath{fill:#333333;}#mermaid-svg-B8lDsccJphKfghEf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B8lDsccJphKfghEf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B8lDsccJphKfghEf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B8lDsccJphKfghEf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B8lDsccJphKfghEf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B8lDsccJphKfghEf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B8lDsccJphKfghEf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B8lDsccJphKfghEf .cluster text{fill:#333;}#mermaid-svg-B8lDsccJphKfghEf .cluster span{color:#333;}#mermaid-svg-B8lDsccJphKfghEf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B8lDsccJphKfghEf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B8lDsccJphKfghEf rect.text{fill:none;stroke-width:0;}#mermaid-svg-B8lDsccJphKfghEf .icon-shape,#mermaid-svg-B8lDsccJphKfghEf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B8lDsccJphKfghEf .icon-shape p,#mermaid-svg-B8lDsccJphKfghEf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B8lDsccJphKfghEf .icon-shape rect,#mermaid-svg-B8lDsccJphKfghEf .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B8lDsccJphKfghEf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B8lDsccJphKfghEf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B8lDsccJphKfghEf :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
失败
失败
失败
失败
抽数:MySQL→ODS
清洗:Hive SQL→DWD
聚合:Spark→DWS
报表:Hive SQL→ADS
同步:DataX→业务库
通知:钉钉成功
告警:钉钉失败
下面逐个任务讲解。
3.4 任务 1:抽取 MySQL → ODS 层(SQL 节点)
任务类型:SQL
数据源:MySQL 业务库
SQL 示例:
SELECT
id,
order_no,
user_id,
pay_amount,
create_time,
pay_time,
order_status
FROM
t_order
WHERE
create_time >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 DAY), '%Y-%m-%d 00:00:00')
AND create_time < DATE_FORMAT(CURDATE(), '%Y-%m-%d 00:00:00')
作用:抽取前一天所有订单,准备入数仓 ODS 层。
3.5 任务 2:清洗 → DWD 层(Hive SQL 节点)
INSERT OVERWRITE TABLE dwd.dwd_order_di
PARTITION (dt = '${dt}')
SELECT
order_no,
user_id,
NVL(pay_amount, 0) AS pay_amount,
create_time,
CASE WHEN order_status IN (0,1) THEN '未支付'
WHEN order_status = 2 THEN '已支付'
ELSE '关闭'
END AS order_status_desc
FROM
ods.ods_order
WHERE
order_no IS NOT NULL
作用:
- 去重
- 空值处理
- 状态转换
- 写入 DWD 明细层
3.6 任务 3:聚合计算 → DWS 层(Spark 节点)
任务类型:Spark
提交方式:Yarn
执行脚本:
object OrderStat {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().enableHiveSupport().getOrCreate()
val dt = args(0)
spark.sql(
s"""
|INSERT OVERWRITE TABLE dws.dws_order_hourly_stat
|PARTITION (dt = '$dt')
|SELECT
| hour(create_time) as hour_info,
| count(order_no) as order_cnt,
| sum(pay_amount) as pay_amount
|FROM dwd.dwd_order_di
|GROUP BY hour(create_time)
|""".stripMargin)
spark.stop()
}
}
作用:
按小时统计订单量、交易额,写入 DWS 汇总层。
3.7 任务 4:生成报表 → ADS 层(Hive SQL)
INSERT OVERWRITE TABLE ads.ads_order_report
PARTITION (dt = '${dt}')
SELECT
hour_info,
order_cnt,
pay_amount
FROM
dws.dws_order_hourly_stat
ORDER BY
hour_info
3.8 任务 5:数据同步 → 业务库(DataX / SQL 节点)
INSERT INTO business.report_order
SELECT
hour_info,
order_cnt,
pay_amount
FROM
ads.ads_order_report
WHERE
dt = '${dt}'
3.9 任务 6:钉钉通知(告警节点)
成功节点:
【订单数仓】${dt} 日数据 ETL 执行完成
失败节点:
【订单数仓异常】${dt} 日任务失败,请尽快处理
实例ID:${instanceId}
3.10 最终效果
你在界面上看到的就是:
一张清晰的 DAG 图,所有依赖、流程、状态一目了然。
这就是大数据平台梦寐以求的:
所见即所得的 ETL 编排能力。
四、核心特性:任务类型丰富,兼容全生态大数据
DolphinScheduler 最恐怖的就是支持的任务类型极多,我给你列生产最常用的:
4.1 支持的任务类型(完整版)
- SQL:MySQL、PostgreSQL、Hive、ClickHouse
- Spark:Spark SQL / Spark 作业
- Flink:流/批任务
- MapReduce
- Shell:Linux 脚本
- Python:数据处理、算法任务
- DataX / FlinkX:数据同步
- Procedure:存储过程
- Pigeon:数据质量检查
- Switch:条件分支
- SubProcess:子流程(嵌套 DAG)
4.2 真正的全生态兼容
- Hadoop
- Hive
- Spark
- Flink
- ClickHouse
- Doris
- StarRocks
- 各种云数仓
只要是大数据生态,DolphinScheduler 都能无缝接入。
4.3 最核心特色:DAG 高级能力
这些特性,是数据平台必须具备的生产能力。
五、优缺点:可视化DAG+多租户,但部署运维复杂度高
任何技术都有两面性,我给你最客观、最生产化的总结:
5.1 优点(生产级真香)
真正可视化 DAG
拖拽画图 = ETL 流程,学习成本极低。
企业级权限 + 多租户
中大型公司、多团队平台必备。
任务类型极其丰富
一套平台调度全生态大数据组件。
高可用、分布式、可扩展
Master/Worker 都可集群,无单点。
完善的告警、日志、审计
出问题可快速定位、可追溯。
支持补数据、重跑、回溯
数仓日常操作必备。
5.2 缺点(必须提前知道)
部署相对较重
依赖:JDK、MySQL、Zookeeper(可选)、Yarn(可选)。
运维成本高于 XXL-JOB
不适合小团队、非大数据场景。
对新手不友好
要懂数仓、SQL、Spark/Flink、Yarn 才能用好。
单机/测试环境轻,生产环境配置繁琐
5.3 一句话总结
如果你做数据平台、数仓、ETL、离线计算,DolphinScheduler 几乎是最优解;
如果你只是做业务定时任务,用 XXL-JOB/PowerJob 更轻量。
六、生产场景:数据仓库每日同步任务编排
我给你还原一个真实互联网公司数仓生产场景:
业务背景
- 日订单 1000w+
- 10+ 张业务表
- 5 层数仓:ODS → DWD → DWS → ADS → 报表
- 涉及:Hive、Spark、ClickHouse、DataX
- 要求:每天 06:00 前跑完,否则影响早会报表
完整 DolphinScheduler 编排结构
生产价值
- 以前:3 个人维护脚本,经常出问题
- 现在:1 个人维护 DAG,自动调度、自动告警、自动重跑
这就是 DolphinScheduler 在生产环境的真正威力。
七、适用场景:数据平台ETL、离线计算、复杂依赖
最后给你最清晰、最能用于面试/架构设计/技术选型的结论:
7.1 强烈推荐使用 DolphinScheduler 的场景
7.2 不推荐使用的场景
7.3 最终选型口诀
业务定时用 XXL,
分片海量 Elastic,
Python 流程用 Airflow,
大数据 ETL 必选 DolphinScheduler!
全文总结
如果你正在做大数据、数仓、数据中台,这篇文章建议你收藏+反复看,
DolphinScheduler 一定会成为你架构图里的核心调度层。
