任务调度:任务调度工具对比

DolphinScheduler vs Airflow vs Azkaban vs Oozie

综合对比

DolphinScheduler

  • Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。

  • DolphinScheduler 特点

    • 高可靠性
      • 去中心化的多 Master 和多 Worker, 自身支持 HA 功能, 采用任务队列来避免过载,不会造成机器卡死
    • 简单易用
      • DAG 监控界面,所有流程定义都是可视化,通过拖拽任务定制DAG;
      • 通过 API 方式与第三方系统对接,方便一键部署;
    • 丰富的使用场景
      • 支持暂停恢复操作. 支持多租户,更好的应对大数据的使用场景. 支持更多的任务类型,如 spark, hive, mr, python, sub_process, shell
    • 高扩展性
      • 支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master和Worker支持动态上下线
  • 主要能力

    • Task 以 DAG 形式关联,实时监控任务的状态;
    • 支持 Shell、MR、Spark、SQL、依赖等 10 多种任务类型;
    • 工作流优先级、任务优先级,全局参数及局部自定义参数;
    • 工作流可定时、依赖、手动、暂停/停止/恢复;
    • 支持补数、多租户、日志在线查看及资源在线管理;
    • 完善的系统服务监控,任务超时告警/失败;
    • 去中心化设计确保系统的稳定、高可用;
    • 支持每日十万数据量级任务稳定运行。

Airflow

  • Airflow 优点
    • 与所有其他解决方案相比,Airflow 是一种功能超强的引擎,可以使用插件来支持各种作业,包括数据处理作业:Hive、Pig、以及通过文件/ db entry / s3来触发的一般流程管理,或者等待来自Web端点的预期输出,
    • Airflow 提供了一个很好的 UI,允许:
      • 查看 log
      • 重跑历史 task
      • 查看 task 代码
      • 监视作业的实时执行
    • Airflow 易于实现分布式任务分发的扩展;
    • 可以使用本地执行程序通过单个节点运行所有作业,或通过 Celery / Dask / Mesos 编排将它们分发到一组工作节点。
  • 缺点
    • Airflow 本身仍然不是很成熟(实际上Oozie可能是这里唯一的“成熟”引擎),调度程序需要定期轮询调度计划并将作业发送给执行程序;
    • 由于有一个集中式调度程序,如果它出现故障或卡住,的正在运行的作业将不会像执行程序的作业那样受到影响,但是不会安排新的作业了。
    • 当使用 HA 设置运行时,这尤其令人困惑,其中有多个 Web 节点,调度程序,代理(通常是Celery案例中的消息队列),多个执行程序。
    • 当调度程序因任何原因而卡住时,在Web UI中看到的所有任务都在运行,但实际上它们实际上并没有向前运行,而执行程序却高兴地报告它们没问题。
    • 分布式系统中代码同步问题
      • Airflow 是分布式任务分发的系统, master 和 worker 会部署在不同的机器上,并且 worker 可以有很多的类型和节点。
      • 当 master 与 worker code 不一致时,会引入一些奇怪的问题,所以需要解决分布式系统中代码升级与同步的问题。

Azkaban

  • 优点
    • 在所有引擎中,Azkaban 可能是最容易开箱即用的;
    • Azkaban UI 非常直观且易于使用;
    • Azkaban 调度和 REST API 工作得很好;
    • 有限的 HA 设置开箱即用;
    • 不需要负载均衡器,因为只能有一个Web节点;
    • 可以配置如何选择执行程序节点,只要有足够的容量来执行程序节点,就可以轻松运行数万个作业。
  • 缺点
    • 作为通用编排引擎,Azkaban 没有非常丰富的功能;
    • Azkaban 的优势在于对 Hadoop / Pig / Hive 的原生支持;
    • 尽管也可以使用命令行实现这些功能,但 Azkaban 本身不能通过 Airflow 等外部资源触发工作,也不支持工作等待模式;
    • Azkaban 文档和配置通常有点混乱,不应该推荐为初学者使用,设计很好但是最好有一个大型数据中心来运行执行程序,因为当执行程序耗尽资源而没有额外的监视功能时,调度会停止。
    • Azkaban 整体代码质量有点朝向低端,所以它通常只有在资源不成问题时才能很好地扩展。

Oozie

  • 优点
    • Oozie 通过 db 设置提供了一个看似可靠的 HA 模型(貌似b / c我没有看到它),它为 Hadoop 相关工作提供本机支持,因为它是为该生态系统构建的。
  • 缺点
    • 对于通用流程调度而言,不是一个非常好的候选者,因为XML定义对于定义轻量级作业非常冗长和繁琐;
    • Oozie 还需要相当多的外设设置:
      • 需要一个 zookeeper 集群,一个db,一个负载均衡器;
      • 每个节点都需要运行像 Tomcat 这样的 Web 应用程序容器;
      • 初始设置也需要一些时间,这对初次使用的用户来说是不友好的。