分布式任务调度系统的功能、作用以及常见框架对比(Azkaban、Oozie、DolphinScheduler)
作者:hangge | 2025-06-04 08:34
1,任务调度系统的作用
(1)随着企业中计算需求的极速增加,离线任务的数量越来越多,每天凌晨需要运行上千个离线任务。这些任务不能同时执行,因为可能会导致集群资源瞬间占满,进而影响线上任务的稳定性。
(2)其实这些离线任务只要能在每天早上上班之前执行完毕,不耽误用户查看报表即可。所以,我们可以在凌晨 0 点到 8 点运行这些任务。其中有一些任务之间是有依赖关系的,需要保证任务的执行顺序——前面的任务执行成功后再执行后面的任务。如果任务执行失败,则需要及时向管理员发送告警信息。这些工作依靠人工来完成是不现实的,此时需要一个通用的任务调度系统。
(3)一个合格的任务调度系统至少需要具备以下功能:
- 定时调度任务。
- 给任务设置依赖关系。
- 任务失败自动告警。
2,传统任务调度系统 Crontab 的痛点
(1)对于企业中的 MapReduce、Hive、Spark 等离线计算任务,如果任务数量比较少,且任务之间没有复杂的依赖关系,则使用 Linux 中的 Crontab 任务调度系统是完全可以满足需求的。
(2)但在实际工作中会遇到类似这样的场景:有一个比较复杂的大任务,该大任务是由 A、B、C、D 四个子任务组成的。子任务 A 和子任务 B 是并行的,没有依赖关系。子任务 C 需要依赖子任务 A 和子任务 B 的结果进行关联计算。子任务 D 需要依赖子任务 C 的结果进行计算。整个执行过程其实类似于一个有向无环图(DAG),如下图所示。

(3)此时,使用 Crontab 就不好实现了,因为此时无法明确知道子任务 A 和子任务 B 需要多长时间能够执行结束。如果固定设置在 1 个小时之后执行子任务 C,则正常情况下是没有问题的。但如果遇到集群资源不足或者其他异常情况——子任务 A 和子任务 B 执行延迟或者变慢了,则最终可能会导致在子任务 C 执行时子任务 A 和子任务 B 还没有执行结束。
(4)如要使用 Crontab 解决这个问题,则需要开发一个 Shell 脚本,将所有子任务的调度放到该 Shell 脚本中,并且在该脚本中增加一定的逻辑判断,判断上一个任务执行成功之后再执行下一个任务。但是在工作中类似这样的需求太多了,每次实现这个逻辑会非常麻烦,并且也不便于后期管理和维护。
(5)如果任务数量比较多,且很多任务之间具有依赖关系,则使用 Crontab 会存在以下问题:
- Crontab 没有提供 Web 管理界面,需要基于 Linux 命令进行管理和维护,如果后期需要排查某个任务的执行情况则非常麻烦。
- Crontab 没有提供自动告警机制,需要用户自己在任务中实现告警。
- Crontab 存在单点故障问题,如果当前机器宕机了,则会导致当前机器上的所有定时任务都无法正常执行。
- Crontab 无法设置任务之间的依赖关系,需要用户自己控制。
3,任务调度技术框架对比
(1)常见的分布式任务调度系统有:
- Azkaban:Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程。
- Oozie:Oozie 是由 Cloudera 公司贡献给 Apache 的基于工作流引擎的开源框架,主要用于 Hadoop 平台的开源工作流调度。
- DolphinScheduler:DolphinScheduler(原 EasyScheduler)是由中国易观公司开源的一款分布式、去中心化、易扩展的可视化 DAG 工作流任务调度平台。该平台致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中“开箱即用”。DolphinScheduler 于 2021 年 3 月 18 日正式成为 Apache 顶级项目,中文名为“海豚调度”。
(2)三者比较:
| 比较项 | Azkaban | Oozie | DolphinScheduler |
| 任务类型 | Shell 脚本及大数据任务 | Shell 脚本及大数据任务 | Shell 脚本及大数据任务 |
| 任务配置 | 通过自定义 DSL 语法配置 | 通过 XML 文件配置 | 通过页面拖拽方式配置 |
| 任务暂停 | 不支持 | 支持 | 支持 |
| 高可用 (HA) | 通过 DB 支持 HA | 通过 DB 支持 HA | 支持 HA(多 Master 和多 Worker) |
| 多租户 | 不支持 | 不支持 | 支持 |
| 邮件告警 | 支持 | 支持 | 支持 |
| 权限控制 | 粗粒度支持 | 粗粒度支持 | 细粒度支持 |
| 成熟度 | 高 | 高 | 中 |
| 易用性 | 高 | 中 | 高 |
| 所属公司 | Cloudera | 中国易观 |
说明:
- 任务类型:Azkaban、Oozie 和 DolphinScheduler 都可以支持传统的 Shell 任务,以及大数据任务,包括 MapReduce、Hive、Sqoop、Spark 等。
- 任务配置:Azkaban 中任务的配置需要自定义 DSL 语法,这有点类似于 Properties 配置文件(先通过 Key-Value 的形式定义具体的任务,以及任务之间的依赖关系;然后将配置好的文件压缩成 Zip 包上传到 Azkaban 平台中;最后在 Azkaban 平台中配置任务触发时间)。Oozie 中的任务配置是通过 XML 文件进行的,直接在 XML 文件中指定具体的任务、任务之间的依赖关系和任务触发时间。DolphinScheduler 中的任务配置是比较简单的:直接在可视化页面中通过拖拽的方式配置任务相关信息。
- 任务暂停:Azkaban 中的任务一旦启动,则不能暂定,只能停止这个任务流再重新执行。Oozie 和 DolphinScheduler 支持任务暂停功能。
- 高可用:Azkaban 中包括 Web Server 和 Executor Server。其中,Executor Server 可以有多个,Web Server 只有一个。Web Server 主要提供 Web 页面服务,存在单点故障。Executor Server 主要负责执行任务,通过底层 DB 实现数据共享,可以支持 HA。Oozie 也是通过底层 DB 支持 HA。DolphinScheduler 通过多个 Master 和多个 Worker 可以支持 HA。
- 多租户:Azkaban 和 Oozie 不支持多租户,DolphinScheduler 支持多租户。
- 邮件告警:Azkaban、Oozie 和 DolphinScheduler 都可以提供任务失败时通过邮件告警,如果有更多告警需求,则可以支持二次开发。
- 权限控制:Azkaban 和 Oozie 只提供了粗粒度的权限控制,可以支持“用户”“用户组”级别的访问权限控制。DolphinScheduler 提供了细粒度的权限控制,可以进行“资源”“项目”“数据源”级别的访问权限控制。
- 成熟度:Azkaban 和 Oozie 已经在企业中广泛应用很长时间了,DolphinScheduler 是在 2021 年才正式开源的,所以目前 Azkaban 和 Oozie 的成熟度要高于 DolphinScheduler。
- 易用性:Azkaban 的任务配置相对来说是比较简单的——只需要定义简单的 Properties 配置文件即可。Oozie 的任务配置需要编写 XML 文件,支持的功能比较完善,但是配置过程比较复杂。DolphinScheduler 的任务配置是基于页面的,也比较简单。
- 所属公司:Azkaban 是 Linkedln 公司开源的。Oozie 是 Cloudeara 公司贡献给 Apache 的开源顶级项目。DolphinScheduler 是中国易观公司贡献给 Apache 的开源顶级项目。相对而言,DolphinScheduler 更加符合中国人的使用习惯。

全部评论(0)