返回 导航

大数据

hangge.com

分布式任务调度系统的功能、作用以及常见框架对比(Azkaban、Oozie、DolphinScheduler)

作者:hangge | 2025-06-04 08:34

1,任务调度系统的作用

(1)随着企业中计算需求的极速增加,离线任务的数量越来越多,每天凌晨需要运行上千个离线任务。这些任务不能同时执行,因为可能会导致集群资源瞬间占满,进而影响线上任务的稳定性。

(2)其实这些离线任务只要能在每天早上上班之前执行完毕,不耽误用户查看报表即可。所以,我们可以在凌晨 0 点到 8 点运行这些任务。其中有一些任务之间是有依赖关系的,需要保证任务的执行顺序——前面的任务执行成功后再执行后面的任务。如果任务执行失败,则需要及时向管理员发送告警信息。这些工作依靠人工来完成是不现实的,此时需要一个通用的任务调度系统。

(3)一个合格的任务调度系统至少需要具备以下功能:
  • 定时调度任务。
  • 给任务设置依赖关系。
  • 任务失败自动告警。

2,传统任务调度系统 Crontab 的痛点

(1)对于企业中的 MapReduceHiveSpark 等离线计算任务,如果任务数量比较少,且任务之间没有复杂的依赖关系,则使用 Linux 中的 Crontab 任务调度系统是完全可以满足需求的。

(2)但在实际工作中会遇到类似这样的场景:有一个比较复杂的大任务,该大任务是由 ABCD 四个子任务组成的。子任务 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)常见的分布式任务调度系统有:
  • AzkabanAzkaban 是由 Linkedin 开源的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程。
  • OozieOozie 是由 Cloudera 公司贡献给 Apache 的基于工作流引擎的开源框架,主要用于 Hadoop 平台的开源工作流调度。
  • DolphinSchedulerDolphinScheduler(原 EasyScheduler)是由中国易观公司开源的一款分布式、去中心化、易扩展的可视化 DAG 工作流任务调度平台。该平台致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中“开箱即用”。DolphinScheduler2021318 日正式成为 Apache 顶级项目,中文名为“海豚调度”。

(2)三者比较:
比较项 Azkaban Oozie DolphinScheduler
任务类型 Shell 脚本及大数据任务 Shell 脚本及大数据任务 Shell 脚本及大数据任务
任务配置 通过自定义 DSL 语法配置 通过 XML 文件配置 通过页面拖拽方式配置
任务暂停 不支持 支持 支持
高可用 (HA) 通过 DB 支持 HA 通过 DB 支持 HA 支持 HA(多 Master 和多 Worker)
多租户 不支持 不支持 支持
邮件告警 支持 支持 支持
权限控制 粗粒度支持 粗粒度支持 细粒度支持
成熟度
易用性
所属公司 Linkedin Cloudera 中国易观
说明:
  • 任务类型AzkabanOozieDolphinScheduler 都可以支持传统的 Shell 任务,以及大数据任务,包括 MapReduceHiveSqoopSpark 等。
  • 任务配置Azkaban 中任务的配置需要自定义 DSL 语法,这有点类似于 Properties 配置文件(先通过 Key-Value 的形式定义具体的任务,以及任务之间的依赖关系;然后将配置好的文件压缩成 Zip 包上传到 Azkaban 平台中;最后在 Azkaban 平台中配置任务触发时间)。Oozie 中的任务配置是通过 XML 文件进行的,直接在 XML 文件中指定具体的任务、任务之间的依赖关系和任务触发时间。DolphinScheduler 中的任务配置是比较简单的:直接在可视化页面中通过拖拽的方式配置任务相关信息。
  • 任务暂停Azkaban 中的任务一旦启动,则不能暂定,只能停止这个任务流再重新执行。OozieDolphinScheduler 支持任务暂停功能。
  • 高可用Azkaban 中包括 Web Server Executor Server。其中,Executor Server 可以有多个,Web Server 只有一个。Web Server 主要提供 Web 页面服务,存在单点故障。Executor Server 主要负责执行任务,通过底层 DB 实现数据共享,可以支持 HAOozie 也是通过底层 DB 支持 HADolphinScheduler 通过多个 Master 和多个 Worker 可以支持 HA
  • 多租户AzkabanOozie 不支持多租户,DolphinScheduler 支持多租户。
  • 邮件告警AzkabanOozieDolphinScheduler 都可以提供任务失败时通过邮件告警,如果有更多告警需求,则可以支持二次开发。
  • 权限控制AzkabanOozie 只提供了粗粒度的权限控制,可以支持“用户”“用户组”级别的访问权限控制。DolphinScheduler 提供了细粒度的权限控制,可以进行“资源”“项目”“数据源”级别的访问权限控制。
  • 成熟度AzkabanOozie 已经在企业中广泛应用很长时间了,DolphinScheduler 是在 2021 年才正式开源的,所以目前 AzkabanOozie 的成熟度要高于 DolphinScheduler
  • 易用性Azkaban 的任务配置相对来说是比较简单的——只需要定义简单的 Properties 配置文件即可。Oozie 的任务配置需要编写 XML 文件,支持的功能比较完善,但是配置过程比较复杂。DolphinScheduler 的任务配置是基于页面的,也比较简单。
  • 所属公司AzkabanLinkedln 公司开源的。OozieCloudeara 公司贡献给 Apache 的开源顶级项目。DolphinScheduler 是中国易观公司贡献给 Apache 的开源顶级项目。相对而言,DolphinScheduler 更加符合中国人的使用习惯。

(3)在企业中进行分布式任务调度系统技术选型时,在基础核心功能区别不大的情况下,企业一般会重点考虑组件的成熟度和易用性这两个因素。
评论

全部评论(0)

回到顶部