未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用范围与待维护事项
本文用于理解批处理工作流调度、绘制依赖图及开展初步选型讨论,不是生产部署指南。横评中的“全球第一”“国内第一”、社区活跃度和 Star、Operator 数量均未核实,不宜作为采购或迁移依据。工具能力须按版本、执行器及 provider 配置确认;Flink checkpoint 触发和模型自动发布仅为场景示意,需另行验证接口、权限及发布控制。cron 示例还需确认解释器路径、日志目录权限和运行环境。会员标记不表示上述比较已获验证。
工作流调度概述
abstract 本文核心内容
- 什么是工作流调度,为什么数据团队离不开它
- 手动执行 → crontab → 专业调度系统的演进之路
- Airflow、DolphinScheduler、Azkaban 三款主流工具横向对比
- 如何根据团队情况做出正确的工具选择
从一个真实的痛点说起
你可能遇到过这样的场景:
每天早上 8 点,你需要把前一天的业务数据从 MySQL 同步到数仓,然后跑一个 Hive 的聚合计算,最后把报表数据写到 ClickHouse 供 BI 工具读取。
一开始,你写了三个 Python 脚本,手动按顺序执行。后来嫌麻烦,用 crontab 排了三个定时任务:
# crontab -e
0 1 * * * python /data/scripts/sync_mysql.py
0 2 * * * python /data/scripts/run_hive_job.py
0 3 * * * python /data/scripts/write_clickhouse.py
看起来能跑,但问题来了:
- 第一个脚本因为 MySQL 数据量突然变大,跑了 2 小时才完成,第二个脚本却在凌晨 2 点准时启动,读到了不完整的数据
- 某台服务器重启了,三个任务全部漏跑,你直到上午 9 点才发现
- 有个脚本失败了,没有任何报警,你是从业务方投诉才知道的
- 你想知道昨天的脚本到底跑了多久,但上述示例没有记录任务输出和耗时;系统 cron 日志也不等同于完整的任务运行记录
这些问题,都是专业工作流调度系统要解决的问题。
什么是工作流调度
工作流(Workflow) 是一系列有顺序依赖的任务集合。
调度(Scheduling) 是在正确的时间、按照正确的顺序、自动执行这些任务的过程。
在数据领域,典型的工作流长这样:
数据采集 → 数据清洗 → 数据转换 → 数据写入 → 报表生成 → 结果推送
每一步都可能依赖上一步的完成,都可能失败,都需要监控和告警。
工作流调度系统的核心能力
一个成熟的工作流调度系统需要提供:
| 能力 | 说明 | 对应的痛点 |
|---|---|---|
| 依赖管理 | 任务 B 必须在任务 A 成功后才能执行 | 脚本执行顺序混乱 |
| 定时触发 | 按时间计划自动启动工作流 | 手动执行低效且不可靠 |
| 失败重试 | 任务失败后自动重试 N 次 | 偶发性网络问题导致失败 |
| 监控告警 | 任务失败或超时时发送通知 | 无感知地失败 |
| 历史记录 | 查看每次运行的状态、时间、日志 | 无法溯源和排查 |
| 可视化界面 | 图形化展示工作流和运行状态 | 排查问题困难 |
| 并行执行 | 没有依赖的任务可以并行跑 | 串行执行效率低 |
| 补数机制 | 对历史时间段重新运行 | 数据修复场景复杂 |
三种方案的演进对比
方案一:手动脚本执行
# 每天手动执行
python sync_mysql.py
python run_hive_job.py
python write_clickhouse.py
优点:简单,不需要额外学习成本 缺点:完全依赖人工,不可靠,无法扩展
适用场景:个人临时数据处理,一次性任务
方案二:crontab 定时任务
# 使用 crontab -e 编辑当前用户的定时任务;不是 /etc/cron.d 文件格式
# 使用前确认 python 指向所需解释器,且当前用户有日志目录写权限
0 1 * * * python /data/scripts/sync_mysql.py >> /var/log/sync.log 2>&1
0 2 * * * python /data/scripts/run_hive_job.py >> /var/log/hive.log 2>&1
0 3 * * * python /data/scripts/write_clickhouse.py >> /var/log/ck.log 2>&1
优点:简单、系统内置、无需额外组件 缺点:
- 无法定义任务依赖(只能用时间间隔模拟)
- 失败不自动重试
- 无集中化监控和告警
- 没有历史记录和统一日志
- 不支持分布式执行
适用场景:任务数量少(5 个以内),任务之间没有复杂依赖,团队规模小
warning crontab 的隐患
用时间间隔模拟依赖关系是一种危险的做法。当上游任务运行时间不稳定时(比如数据量增长了 5 倍),下游任务会读到不完整的数据,而且这个错误很难被及时发现。
方案三:专业工作流调度系统
以 Airflow 为代表,提供完整的工作流管理能力:
# 用代码定义工作流,依赖关系清晰
sync_task >> hive_task >> clickhouse_task
优点:
- 基于有向无环图(DAG)的依赖管理,逻辑清晰
- 内置重试机制
- 集中化监控和告警
- 完整的运行历史和日志
- 支持分布式执行
- 丰富的 Operator 生态(内置对接 Hive、Spark、MySQL 等)
缺点:
- 学习成本比 crontab 高
- 部署和维护需要额外的基础设施
- 对小团队可能有点重
适用场景:任务数量多,有复杂的依赖关系,需要可靠性保障的生产环境
主流调度工具横评
Airflow、DolphinScheduler、Azkaban 对比
| 维度 | Apache Airflow | DolphinScheduler | Azkaban |
|---|---|---|---|
| 开发语言 | Python | Java | Java |
| 流行程度(原稿判断,未核实) | 原稿称“全球第一”,缺少统计口径 | 原稿称“国内第一”,缺少统计口径 | 原稿称“正在衰退”,缺少趋势依据 |
| 开源协议 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
| DAG 定义方式 | Python 代码 | 可视化拖拽 + 代码 | 配置文件(.job) |
| 学习曲线 | 中等(需要写 Python) | 低(拖拽配置) | 低(配置文件) |
| 社区活跃度 | 极高 | 高(国内为主) | 低 |
| Operator 生态 | 极丰富(数百个) | 较丰富 | 较少 |
| 分布式能力 | 强(Celery/K8s) | 强(天生分布式) | 一般 |
| 多租户支持 | 弱(需额外配置) | 强(内置) | 一般 |
| 监控可视化 | 良好 | 良好 | 基础 |
| 适合场景 | 代码能力强的团队 | 国内中大型企业 | 简单场景 |
| 是否推荐 | Python 技术栈团队可优先评估 | 有可视化配置需求的团队可评估 | 需按需求和维护情况评估,不能仅凭原稿“已过时”的判断排除 |
tip 选型建议
- 团队有 Python 能力,且需要与 Hadoop/Spark/Kubernetes 等技术栈深度集成 → 选 Airflow
- 国内企业,需要可视化配置界面,有多项目/多租户需求 → 选 DolphinScheduler
- 已经在用 Azkaban 且运行稳定 → 可暂不迁移;新项目是否采用,应结合功能需求、维护情况和迁移成本评估
Airflow 的核心优势
1. Python 原生,表达力强
工作流用 Python 代码定义,意味着你可以用任何 Python 的能力来生成 DAG:
- 循环生成动态任务
- 从数据库读取配置
- 条件判断决定执行哪个分支
- 函数封装复用逻辑
2. Operator 生态极其丰富
Airflow 内置和社区提供了数百个 Operator,几乎覆盖了所有常用的数据工具:
BashOperator, PythonOperator, SQLExecuteQueryOperator,
HiveOperator, SparkSubmitOperator, EmailOperator,
S3Operator, GCSOperator, BigQueryOperator,
DockerOperator, KubernetesPodOperator...
3. 社区资源(规模判断待核实)
原稿称 GitHub Star 数超过 35,000、每周有大量的 issue 被修复;这些数字和频率尚未核实,也未注明统计时间。Stack Overflow 或 GitHub 可作为问题检索渠道,但不保证所有问题都能找到适用于当前版本的答案。
4. 云平台托管版本
AWS(MWAA)、Google Cloud(Cloud Composer)、Astronomer 都提供 Airflow 托管服务,降低了运维复杂度。
DolphinScheduler 的核心优势
如果你在国内企业工作,DolphinScheduler 也是一个非常值得考虑的选择,详细对比参见 DolphinScheduler/00-DolphinScheduler概述与对比。
Airflow 在数据团队的典型使用场景
场景一:每日数据仓库 ETL
凌晨 1 点触发
→ 从 MySQL 业务库抽取增量数据
→ 写入 HDFS 原始区
→ Spark 清洗转换
→ 写入 Hive ODS 层
→ Hive SQL 聚合计算
→ 写入 DWS 层
→ 同步到 MySQL 供 BI 读取
→ 发送完成通知
场景二:实时数仓的离线补全
小时级触发
→ 检查 Kafka 消费延迟是否正常
→ 触发 Flink 作业的 checkpoint
→ 汇总小时数据到日统计表
→ 数据质量检查(行数、空值率)
→ 异常时发告警
场景三:机器学习模型训练流水线
每周日触发
→ 准备训练数据(特征工程)
→ 触发 Spark MLlib 模型训练
→ 模型效果评估
→ 若效果好于阈值,自动发布新模型
→ 通知模型团队
场景四:数据报表自动生成
工作日 7 点触发
→ 检查数仓数据是否就绪(Sensor)
→ 执行报表 SQL
→ 生成 Excel 文件
→ 发送邮件给管理层
小结
note 关键结论
- crontab 适合简单场景,但在任务依赖和可靠性方面有根本性缺陷
- Airflow 可作为代码能力强的数据团队的候选工具;原稿“目前全球最流行”的排名判断尚未核实
- DolphinScheduler 提供可视化配置方式,可纳入选型评估;原稿“在国内企业中更流行”的判断尚未核实,实际学习成本取决于任务复杂度和团队经验
- 选工具的核心标准:团队技术栈、任务复杂度、运维能力
下一篇:02-Airflow核心概念 — 深入理解 DAG、Task、Operator 等核心概念
所属系列:00-Airflow学习路线图 | 上一篇:路线图 | 下一篇:02-Airflow核心概念
#Airflow #工作流调度 #crontab #ETL #数据工程 #调度系统
info 前置知识
阅读本文前,建议具备以下基础:
- 了解 Linux 基本命令行操作(文件路径、权限)
- 写过至少一个 Python 或 Shell 脚本
- 知道什么是 ETL(数据抽取、转换、加载)
掌握检查
完成本文学习后,请确认以下内容:
- [ ] 能说清楚 crontab 在任务依赖管理上的根本缺陷(不仅仅是"不好用")
- [ ] 能说出专业调度系统相比 crontab 多出的三个核心能力(可视化监控、依赖管理、失败重试)
- [ ] 能根据团队情况(技术背景、任务复杂度)在 Airflow 和 DolphinScheduler 之间做出选择
- [ ] 理解为什么数据管道任务不能简单地用时间间隔错开来模拟依赖关系
实践练习
基础题:把你日常工作中一个手动执行或 crontab 调度的任务,画出它的完整依赖图(哪些步骤依赖哪些步骤,哪些可以并行)。如果这个任务要放到 Airflow 里,大概需要几个 Task?
进阶题:对比 Airflow 和 DolphinScheduler 的一个具体差异点——Airflow 的 DAG 是 Python 代码,DolphinScheduler 是可视化拖拽。这个差异对一个 5 人数据团队意味着什么?给出你的判断和理由。