一、前言:调度器江湖
graph LR
A[你] --> B{选择调度器}
B --> C["Airflow
国际范儿"] B --> D["DolphinScheduler
国产之光"] B --> E["XXL-Job
轻量级"] B --> F["Azkaban
老前辈"] B --> G["Oozie
Hadoop御用"] A --> H["选择困难症发作 🤯"]
国际范儿"] B --> D["DolphinScheduler
国产之光"] B --> E["XXL-Job
轻量级"] B --> F["Azkaban
老前辈"] B --> G["Oozie
Hadoop御用"] A --> H["选择困难症发作 🤯"]
本文将对比的调度器:
| 调度器 | 定位 | 背景 |
|---|---|---|
| Airflow | 工作流编排平台 | Apache 顶级项目,Airbnb 开源 |
| DolphinScheduler | 分布式调度平台 | Apache 顶级项目,国产开源 |
| XXL-Job | 分布式任务调度 | 国产开源,轻量级 |
| Azkaban | 工作流调度 | LinkedIn 开源,老牌 |
| Oozie | Hadoop 工作流 | Apache 项目,Hadoop 生态 |
二、一图看懂定位差异
2.1 功能定位矩阵
quadrantChart
title 调度器定位象限
x-axis 轻量简单 --> 功能丰富
y-axis 代码定义 --> 可视化
quadrant-1 功能强+可视化
quadrant-2 轻量+可视化
quadrant-3 轻量+代码
quadrant-4 功能强+代码
Airflow: [0.85, 0.15]
DolphinScheduler: [0.75, 0.85]
XXL-Job: [0.25, 0.70]
Azkaban: [0.40, 0.60]
Oozie: [0.60, 0.30]
2.2 适用场景速览
graph TB
subgraph "你的场景是..."
A[复杂数据管道
Python技术栈] --> R1[Airflow ✅] B[大数据ETL
可视化编排] --> R2[DolphinScheduler ✅] C[简单定时任务
快速上手] --> R3[XXL-Job ✅] D[Hadoop生态
已有投入] --> R4[Oozie/Azkaban] E[多租户平台
资源隔离] --> R5[DolphinScheduler ✅] end
Python技术栈] --> R1[Airflow ✅] B[大数据ETL
可视化编排] --> R2[DolphinScheduler ✅] C[简单定时任务
快速上手] --> R3[XXL-Job ✅] D[Hadoop生态
已有投入] --> R4[Oozie/Azkaban] E[多租户平台
资源隔离] --> R5[DolphinScheduler ✅] end
三、核心维度对比
3.1 架构对比
graph TB
subgraph "Airflow"
A1[Scheduler] --> A2[Worker 1]
A1 --> A3[Worker 2]
A4[Webserver]
A1 --> A5[(PostgreSQL)]
A1 --> A6[(Redis/RabbitMQ)]
end
graph TB
subgraph "DolphinScheduler"
B1[Master 1] --> B4[Worker 1]
B2[Master 2] --> B5[Worker 2]
B3[Master 3] --> B6[Worker 3]
B1 & B2 & B3 --> B7[(ZooKeeper)]
B1 & B2 & B3 --> B8[(MySQL)]
end
graph TB
subgraph "XXL-Job"
C1[Admin调度中心] --> C2[Executor 1]
C1 --> C3[Executor 2]
C1 --> C4[Executor 3]
C1 --> C5[(MySQL)]
end
3.2 架构特点对比表
| 维度 | Airflow | DolphinScheduler | XXL-Job |
|---|---|---|---|
| 架构模式 | 中心化 Scheduler | 去中心化 Master | 中心化 Admin |
| 依赖组件 | Redis/RabbitMQ | ZooKeeper | 仅 MySQL |
| 高可用 | 需配置 HA | 原生支持 | 需自行实现 |
| 扩展方式 | 增加 Worker | 增加 Master/Worker | 增加 Executor |
| 部署复杂度 | 中等 | 中等 | 简单 |
3.3 任务定义方式
graph LR
subgraph "Airflow: Python代码"
A["@task
def extract():
..."] end subgraph "DolphinScheduler: 可视化拖拽" B["🖱️ 拖拽节点
📝 填写参数
🔗 连线"] end subgraph "XXL-Job: 注解+配置" C["@XxlJob('handler')
public void run() {
...
}"] end
def extract():
..."] end subgraph "DolphinScheduler: 可视化拖拽" B["🖱️ 拖拽节点
📝 填写参数
🔗 连线"] end subgraph "XXL-Job: 注解+配置" C["@XxlJob('handler')
public void run() {
...
}"] end
代码示例对比:
# ========== Airflow ==========
from airflow.decorators import dag, task
from datetime import datetime
@dag(schedule_interval='@daily', start_date=datetime(2024, 1, 1))
def etl_pipeline():
@task
def extract():
return {'data': [1, 2, 3]}
@task
def transform(data):
return [x * 2 for x in data['data']]
@task
def load(data):
print(f"Loading {data}")
raw = extract()
transformed = transform(raw)
load(transformed)
etl_dag = etl_pipeline()// ========== XXL-Job ==========
@Component
public class MyJobHandler {
@XxlJob("extractHandler")
public void extractJob() {
XxlJobHelper.log("开始抽取数据");
// 业务逻辑
XxlJobHelper.handleSuccess("抽取完成");
}
@XxlJob("transformHandler")
public void transformJob() {
String param = XxlJobHelper.getJobParam();
XxlJobHelper.log("参数: " + param);
// 业务逻辑
}
}// ========== DolphinScheduler (可视化配置) ==========
{
"taskType": "SHELL",
"name": "extract_data",
"taskParams": {
"rawScript": "python extract.py --date ${dt}"
}
}四、功能特性对比
4.1 核心功能矩阵
| 功能 | Airflow | DolphinScheduler | XXL-Job | Azkaban |
|---|---|---|---|---|
| DAG 可视化 | 只读 | 可编辑 | ❌ | 只读 |
| 依赖管理 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 定时调度 | ✅ Cron | ✅ Cron | ✅ Cron | ✅ Cron |
| 任务重试 | ✅ | ✅ | ✅ | ✅ |
| 失败告警 | ✅ | ✅ | ✅ | ✅ |
| 补数/重跑 | ✅ catchup | ✅ 原生 | ⚠️ 手动 | ✅ |
| 多租户 | ❌ | ✅ 原生 | ❌ | ❌ |
| 资源隔离 | Pool/Queue | 租户+队列 | 执行器分组 | ❌ |
| Worker 分组 | ✅ | ✅ | ✅ | ❌ |
| 日志查看 | ✅ | ✅ | ✅ | ✅ |
| API 支持 | ✅ REST | ✅ REST | ✅ REST | ✅ |
| 版本管理 | ❌ 需 Git | ✅ 内置 | ❌ | ❌ |
4.2 大数据任务支持
graph TB
subgraph "任务类型支持"
A[Shell/Python] --> A1["All ✅"]
B[Spark] --> B1["Airflow: SparkSubmitOperator
DS: Spark任务
XXL-Job: 需封装"] C[Flink] --> C1["Airflow: FlinkOperator
DS: Flink任务
XXL-Job: 需封装"] D[Hive] --> D1["Airflow: HiveOperator
DS: Hive任务
XXL-Job: 需封装"] E[DataX] --> E1["Airflow: BashOperator
DS: DataX任务原生
XXL-Job: 需封装"] end
DS: Spark任务
XXL-Job: 需封装"] C[Flink] --> C1["Airflow: FlinkOperator
DS: Flink任务
XXL-Job: 需封装"] D[Hive] --> D1["Airflow: HiveOperator
DS: Hive任务
XXL-Job: 需封装"] E[DataX] --> E1["Airflow: BashOperator
DS: DataX任务原生
XXL-Job: 需封装"] end
| 任务类型 | Airflow | DolphinScheduler | XXL-Job |
|---|---|---|---|
| Shell/Python | ✅ 原生 | ✅ 原生 | ✅ 原生 |
| SQL | ✅ 多种 Operator | ✅ 原生 | ⚠️ 需封装 |
| Spark | ✅ SparkSubmitOperator | ✅ 原生 | ⚠️ 需封装 |
| Flink | ✅ FlinkOperator | ✅ 原生 | ⚠️ 需封装 |
| Hive | ✅ HiveOperator | ✅ 原生 | ⚠️ 需封装 |
| DataX | ⚠️ 需封装 | ✅ 原生 | ⚠️ 需封装 |
| SeaTunnel | ⚠️ 需封装 | ✅ 原生 | ⚠️ 需封装 |
| K8s Pod | ✅ KubernetesPodOperator | ✅ 原生 | ⚠️ 需封装 |
| HTTP | ✅ HttpOperator | ✅ 原生 | ⚠️ 需封装 |
4.3 工作流能力对比
flowchart TB
subgraph "工作流能力"
A[串行执行] --> A1["All ✅"]
B[并行执行] --> B1["All ✅"]
C[条件分支] --> C1["Airflow: BranchOperator ✅
DS: Conditions ✅
XXL-Job: ❌"] D[循环/子流程] --> D1["Airflow: SubDagOperator ✅
DS: SubProcess ✅
XXL-Job: ❌"] E[动态任务] --> E1["Airflow: Dynamic Task ✅
DS: ❌
XXL-Job: ❌"] F[跨DAG依赖] --> F1["Airflow: ExternalTaskSensor ✅
DS: Dependent ✅
XXL-Job: ⚠️ 需代码"] end
DS: Conditions ✅
XXL-Job: ❌"] D[循环/子流程] --> D1["Airflow: SubDagOperator ✅
DS: SubProcess ✅
XXL-Job: ❌"] E[动态任务] --> E1["Airflow: Dynamic Task ✅
DS: ❌
XXL-Job: ❌"] F[跨DAG依赖] --> F1["Airflow: ExternalTaskSensor ✅
DS: Dependent ✅
XXL-Job: ⚠️ 需代码"] end
五、运维与部署对比
5.1 部署复杂度
xychart-beta
title "部署复杂度对比(分数越低越简单)"
x-axis ["Airflow", "DolphinScheduler", "XXL-Job", "Azkaban", "Oozie"]
y-axis "复杂度" 0 --> 10
bar [7, 6, 3, 5, 8]
| 调度器 | 最小部署 | 生产部署 | 依赖组件 |
|---|---|---|---|
| Airflow | 单机 | Webserver + Scheduler + Worker + DB + MQ | PostgreSQL, Redis/RabbitMQ |
| DolphinScheduler | 单机 | Master(3) + Worker(n) + API + Alert + DB + ZK | MySQL, ZooKeeper |
| XXL-Job | 单机 | Admin(2) + Executor(n) + DB | MySQL |
| Azkaban | 单机 | Web + Executor(n) + DB | MySQL |
| Oozie | 需 Hadoop | Oozie Server + Hadoop | Hadoop, MySQL |
5.2 高可用对比
graph TB
subgraph "Airflow HA"
A1["Scheduler HA
Airflow 2.0+ 支持多实例"] A2["Webserver: 负载均衡"] A3["Worker: Celery/K8s"] A4["需要额外配置"] end
Airflow 2.0+ 支持多实例"] A2["Webserver: 负载均衡"] A3["Worker: Celery/K8s"] A4["需要额外配置"] end
graph TB
subgraph "DolphinScheduler HA"
B1["Master: 原生多实例"]
B2["Worker: 原生多实例"]
B3["API: 负载均衡"]
B4["天然去中心化"]
end
graph TB
subgraph "XXL-Job HA"
C1["Admin: 多实例需自行配置"]
C2["Executor: 原生多实例"]
C3["需要额外考虑"]
end
5.3 资源占用
| 调度器 | 最小内存 | 生产内存 | CPU 消耗 |
|---|---|---|---|
| Airflow | 2GB | 8GB+ | 中等 |
| DolphinScheduler | 4GB | 16GB+ | 中等 |
| XXL-Job | 512MB | 2GB+ | 低 |
| Azkaban | 1GB | 4GB+ | 低 |
六、易用性对比
6.1 学习曲线
xychart-beta
title "学习曲线对比(分数越高越陡峭)"
x-axis ["Airflow", "DolphinScheduler", "XXL-Job", "Azkaban"]
y-axis "难度" 0 --> 10
bar [7, 4, 3, 5]
| 调度器 | 编程要求 | 上手时间 | 精通时间 |
|---|---|---|---|
| Airflow | Python 必须 | 1-2 周 | 1-2 月 |
| DolphinScheduler | 可选 | 1-3 天 | 2-4 周 |
| XXL-Job | Java(开发任务) | 1-2 天 | 1-2 周 |
| Azkaban | 可选 | 2-3 天 | 1-2 周 |
6.2 文档与社区
graph TB
subgraph "社区活跃度"
A[Airflow] --> A1["GitHub: 35k+ ⭐
国际社区活跃
英文文档完善"] B[DolphinScheduler] --> B1["GitHub: 12k+ ⭐
国内社区活跃
中文文档完善"] C[XXL-Job] --> C1["GitHub: 27k+ ⭐
国内社区活跃
中文文档"] end
国际社区活跃
英文文档完善"] B[DolphinScheduler] --> B1["GitHub: 12k+ ⭐
国内社区活跃
中文文档完善"] C[XXL-Job] --> C1["GitHub: 27k+ ⭐
国内社区活跃
中文文档"] end
| 调度器 | GitHub Stars | 中文文档 | 社区支持 | 商业支持 |
|---|---|---|---|---|
| Airflow | 35k+ | 有限 | 国际活跃 | Astronomer |
| DolphinScheduler | 12k+ | 完善 | 国内活跃 | 白鲸开源 |
| XXL-Job | 27k+ | 完善 | 国内活跃 | 无 |
| Azkaban | 4k+ | 有限 | 一般 |
6.3 用户界面对比
graph LR
subgraph "Airflow UI"
A1["✅ DAG列表清晰"]
A2["✅ 甘特图/树形图"]
A3["✅ 日志查看"]
A4["❌ DAG只读"]
A5["⚠️ 现代感一般"]
end
graph LR
subgraph "DolphinScheduler UI"
B1["✅ 可视化DAG编辑"]
B2["✅ 多租户管理"]
B3["✅ 资源中心"]
B4["✅ 界面美观"]
B5["✅ 中文友好"]
end
graph LR
subgraph "XXL-Job UI"
C1["✅ 简洁明了"]
C2["✅ 任务列表"]
C3["✅ 日志滚动"]
C4["❌ 无DAG可视化"]
C5["✅ 轻量"]
end
七、性能对比
7.1 调度性能
xychart-beta
title "任务调度吞吐量(任务/分钟)"
x-axis ["Airflow", "DolphinScheduler", "XXL-Job"]
y-axis "吞吐量" 0 --> 5000
bar [1000, 2000, 4000]
| 调度器 | 单机调度能力 | 集群调度能力 | 调度延迟 |
|---|---|---|---|
| Airflow | 中等 | 高 | 秒级 |
| DolphinScheduler | 高 | 很高 | 秒级 |
| XXL-Job | 很高 | 很高 | 毫秒级 |
7.2 适用规模
| 调度器 | 小规模(<100任务/天) | 中规模(100-10k) | 大规模(>10k) |
|---|---|---|---|
| Airflow | ✅ | ✅ | ✅ |
| DolphinScheduler | ✅ | ✅ | ✅ |
| XXL-Job | ✅ | ✅ | ⚠️ |
| Azkaban | ✅ | ✅ | ⚠️ |
八、场景选型指南
8.1 决策流程图
flowchart TD
START[开始选型] --> Q1{任务类型?}
Q1 -->|简单定时任务
Java技术栈| A1[XXL-Job] Q1 -->|复杂数据管道
ETL工作流| Q2{团队技术栈?} Q2 -->|精通Python
喜欢代码控制| A2[Airflow] Q2 -->|偏好可视化
低代码| A3[DolphinScheduler] Q2 -->|Hadoop生态
历史包袱| A4[Oozie/Azkaban] A2 --> Q3{国内/国际?} Q3 -->|国际团队
英文环境| A2_FINAL[Airflow ✅] Q3 -->|国内团队| Q4{运维能力?} Q4 -->|强| A2_FINAL Q4 -->|一般| A3 A1 --> A1_FINAL[XXL-Job ✅] A3 --> A3_FINAL[DolphinScheduler ✅] A4 --> A4_FINAL[Oozie/Azkaban] style A1_FINAL fill:#4ecdc4 style A2_FINAL fill:#ff6b6b style A3_FINAL fill:#ffeaa7
Java技术栈| A1[XXL-Job] Q1 -->|复杂数据管道
ETL工作流| Q2{团队技术栈?} Q2 -->|精通Python
喜欢代码控制| A2[Airflow] Q2 -->|偏好可视化
低代码| A3[DolphinScheduler] Q2 -->|Hadoop生态
历史包袱| A4[Oozie/Azkaban] A2 --> Q3{国内/国际?} Q3 -->|国际团队
英文环境| A2_FINAL[Airflow ✅] Q3 -->|国内团队| Q4{运维能力?} Q4 -->|强| A2_FINAL Q4 -->|一般| A3 A1 --> A1_FINAL[XXL-Job ✅] A3 --> A3_FINAL[DolphinScheduler ✅] A4 --> A4_FINAL[Oozie/Azkaban] style A1_FINAL fill:#4ecdc4 style A2_FINAL fill:#ff6b6b style A3_FINAL fill:#ffeaa7
8.2 场景推荐表
| 场景 | 推荐 | 次选 | 不推荐 |
|---|---|---|---|
| Java 后端定时任务 | XXL-Job | - | Airflow |
| 复杂数据管道 | Airflow | DolphinScheduler | XXL-Job |
| 大数据 ETL | DolphinScheduler | Airflow | XXL-Job |
| 多租户数据平台 | DolphinScheduler | - | Airflow |
| ML Pipeline | Airflow | DolphinScheduler | XXL-Job |
| 微服务定时任务 | XXL-Job | DolphinScheduler | - |
| 快速上手 | XXL-Job | DolphinScheduler | Airflow |
| 国内中小团队 | DolphinScheduler | XXL-Job | - |
8.3 公司规模推荐
graph TB
subgraph "公司规模"
A[创业公司
< 50人] --> A1["XXL-Job
或 DolphinScheduler"] B[中型公司
50-500人] --> B1["DolphinScheduler
或 Airflow"] C[大型公司
> 500人] --> C1["Airflow
或 DolphinScheduler"] end A1 --> A2["理由:快速上手
运维简单"] B1 --> B2["理由:功能全面
可扩展"] C1 --> C2["理由:生态丰富
定制性强"]
< 50人] --> A1["XXL-Job
或 DolphinScheduler"] B[中型公司
50-500人] --> B1["DolphinScheduler
或 Airflow"] C[大型公司
> 500人] --> C1["Airflow
或 DolphinScheduler"] end A1 --> A2["理由:快速上手
运维简单"] B1 --> B2["理由:功能全面
可扩展"] C1 --> C2["理由:生态丰富
定制性强"]
九、迁移指南
9.1 从 Crontab 迁移
flowchart LR
A[Crontab] --> B{任务复杂度}
B -->|简单定时| C[XXL-Job]
B -->|有依赖关系| D[DolphinScheduler]
B -->|复杂逻辑| E[Airflow]
迁移步骤:
# Crontab 原配置
0 2 * * * /scripts/extract.sh
30 2 * * * /scripts/transform.sh
0 3 * * * /scripts/load.sh# 迁移到 Airflow
@dag(schedule_interval='0 2 * * *')
def etl_pipeline():
extract = BashOperator(task_id='extract', bash_command='/scripts/extract.sh')
transform = BashOperator(task_id='transform', bash_command='/scripts/transform.sh')
load = BashOperator(task_id='load', bash_command='/scripts/load.sh')
extract >> transform >> load9.2 从 Azkaban 迁移
flowchart LR
A[Azkaban] --> B{选择目标}
B --> C[DolphinScheduler]
B --> D[Airflow]
C --> C1["迁移相对简单
可视化对可视化"] D --> D1["需要改写代码
但更灵活"]
可视化对可视化"] D --> D1["需要改写代码
但更灵活"]
9.3 迁移注意事项
mindmap
root((迁移注意事项))
任务改造
Shell任务通用性高
SQL任务需适配数据源
大数据任务检查参数
依赖关系
梳理任务依赖
跨系统依赖处理
时间依赖转换
参数传递
变量格式差异
时间参数适配
上下文传递方式
监控告警
告警渠道迁移
监控指标适配
日志收集方式
十、混合架构方案
10.1 大厂常见架构
graph TB
subgraph "混合调度架构"
subgraph "数据平台层"
DS[DolphinScheduler
大数据ETL] end subgraph "应用服务层" XXL[XXL-Job
业务定时任务] end subgraph "ML平台层" AF[Airflow
ML Pipeline] end end DS --> |触发| XXL AF --> |调用| DS
大数据ETL] end subgraph "应用服务层" XXL[XXL-Job
业务定时任务] end subgraph "ML平台层" AF[Airflow
ML Pipeline] end end DS --> |触发| XXL AF --> |调用| DS
10.2 分层调度策略
| 层级 | 调度器 | 任务类型 |
|---|---|---|
| 数据层 | DolphinScheduler | Spark、Flink、Hive、DataX |
| 应用层 | XXL-Job | 业务定时任务、数据同步 |
| ML 层 | Airflow | 模型训练、特征工程 |
10.3 统一调度中台
graph TB
subgraph "统一调度中台"
PORTAL[统一门户] --> ROUTER[路由层]
ROUTER --> DS[DolphinScheduler]
ROUTER --> XXL[XXL-Job]
ROUTER --> AF[Airflow]
MONITOR[统一监控] --> DS & XXL & AF
ALERT[统一告警] --> DS & XXL & AF
end
十一、总结与建议
11.1 综合评分
radar
title 调度器综合能力雷达图
variables [功能丰富度, 易用性, 性能, 扩展性, 社区生态, 运维难度]
values [[85, 60, 75, 90, 95, 50], [80, 90, 85, 85, 75, 80], [60, 85, 95, 70, 80, 90]]
| 维度 | Airflow | DolphinScheduler | XXL-Job |
|---|---|---|---|
| 功能丰富度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 易用性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 扩展性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 社区生态 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 运维难度 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 中文支持 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
11.2 最终推荐
graph TD
A["最终推荐"] --> B["如果你是..."]
B --> C["Python技术栈
需要复杂工作流
国际化团队"] B --> D["大数据平台
需要可视化
多租户需求"] B --> E["Java技术栈
简单定时任务
快速上手"] C --> C1["选择 Airflow
🎯 工作流编排之王"] D --> D1["选择 DolphinScheduler
🎯 国产之光"] E --> E1["选择 XXL-Job
🎯 轻量级首选"] style C1 fill:#ff6b6b style D1 fill:#4ecdc4 style E1 fill:#ffeaa7
需要复杂工作流
国际化团队"] B --> D["大数据平台
需要可视化
多租户需求"] B --> E["Java技术栈
简单定时任务
快速上手"] C --> C1["选择 Airflow
🎯 工作流编排之王"] D --> D1["选择 DolphinScheduler
🎯 国产之光"] E --> E1["选择 XXL-Job
🎯 轻量级首选"] style C1 fill:#ff6b6b style D1 fill:#4ecdc4 style E1 fill:#ffeaa7
11.3 口诀总结
Airflow:Python 控,代码流,国际范儿大厂标配
DolphinScheduler:可视化,去中心,国产开源多租户
XXL-Job:轻量级,上手快,Java 定时任务首选
Azkaban/Oozie:老前辈,Hadoop 生态可以考虑
11.4 选型 Checklist
在做最终决策前,请回答以下问题:
□ 团队主要技术栈是什么?(Python/Java/其他)
□ 任务是简单定时还是复杂工作流?
□ 是否需要可视化 DAG 编辑?
□ 是否需要多租户资源隔离?
□ 团队运维能力如何?
□ 是否有大数据任务(Spark/Flink/Hive)?
□ 预期任务规模是多少?
□ 是否需要中文文档和社区支持?十二、附录
12.1 快速安装命令
# ===== Airflow =====
pip install apache-airflow
airflow standalone # 快速启动
# ===== DolphinScheduler =====
# Docker方式
docker run -d --name dolphinscheduler \
-p 12345:12345 \
apache/dolphinscheduler-standalone-server:latest
# ===== XXL-Job =====
git clone https://github.com/xuxueli/xxl-job.git
cd xxl-job
mvn clean package -DskipTests
# 启动 xxl-job-admin