技术选型-分布式任务调度系统
前言:该博客主要是记录自己学习的过程,方便以后查看,当然也希望能够帮到大家。
调研:
-
现在的开源调度系统分为两类:以Quartz为代表的定时类调度系统和以DAG为核心的工作流调度系统。
-
首先看看定时类调度系统,它们的设计核心是定时运行、数据分片和弹性扩容,但是对依赖关系支持的不太友好,更适用于后端业务开发 。
-
数据团队最常见的操作是的 ETL (抽取、转换和加载数据),更强调的是任务的依赖关系,所以关注点便是以DAG为核心的工作流调度系统了。
以Quartz为代表的定时类调度系统(挑选比较流行的)
Elastic-Job:是由当当网基于quartz 二次开发之后的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性。
Xxl-Job:是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,支持通过 Web 页面对任务进行 CRUD 操作,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,支持在线配置调度任务入参和在线查看调度结果。
Saturn:是唯品会基于elastic-job开发的分布式定时任务调度框架,能够实现集中化统一配置、基于exector负载的任务分片调度、任务监控告警及api任务管理等平台功能,更重要的是其还支持docker,同时saturn(开源版本)中的任务不仅支持java,还支持shell脚本。
PowerJob:(原OhMyScheduler)是全新一代分布式调度与计算框架,支持CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全。
以DAG为核心的工作流调度系统(挑选比较流行的)
Apache DolphinScheduler:DolphinScheduler曾用名为“EasyScheduler”,由易观开发,美国时间2019年8月29日,正式通过顶级开源组织Apache基金会的投票决议,以全票通过的优秀表现正式成为Apache孵化器项目。是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
Apache Oozie:由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,用来管理 Hadoop 任务。Oozie 是基于 XML 格式进行开发的,后续集成到 Hue 里可以可视化配置,但是缺点也很明显,版本管理、日志收集都不太友好,开发灵活性很差,可调度的任务也很少,另外定义过于复杂,维护成本很高。当然最核心还是没有共用变量和共用连接信息的概念。
Apache Airflow:是Airbnb开源的一款数据流程工具,已经在Apache孵化成功,成为Apache的顶级项目。以非常灵活的方式来支持数据的ETL过程,同时还支持非常多的插件来完成诸如HDFS监控、邮件通知等功能。Airflow支持单机和分布式两种模式,支持Master-Slave模式,支持Mesos等资源调度,有非常好的扩展性。
Azkaban:是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。和 Oozie 差不多,缺点也很明显,最核心的问题还是没有共用变量和共用连接信息的概念。
以Quartz为代表的定时类调度系统对比
feature | Saturn | Xxl-Job | Elastic-Job |
---|---|---|---|
依赖 | jdk1.7+,Maven 3.0.4+,node.js 8.7.0+,npm 5.4.2+,git | mysql ,jdk1.7+ , maven3.0+ | jdk1.8+, zookeeper 3.6.x+ ,maven3.0.4+ ,mesos |
调度中心HA | 支持 | 支持 | 支持 |
执行器HA | 支持 | 支持 | 支持 |
弹性扩容 | 通过zookeeper实现服务的注册、协调及控制能支持容器化技术进行 executor 扩容和减容,保证高峰期处理能力的弹性伸缩。 | 使用 Quartz 基于数据库的分布式功能,服务器超出一定数量会给数据库造成一定的压力。 | 通过zookeeper的注册与发现,可以动态的添加服务器, 支持水平扩容。 |
动态分片策略 | 支持多种分片策略,可自定义分片策略。 | 分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 | 人工指定资源分配策略 + 自动平均策略结合。 |
阻塞处理策略 | zookeeper的session timeout超时,临时节点会被清除,作业重新分片 | 单机串行、丢弃后续调度、覆盖之前的调度 | zookeeper的session timeout超时,临时节点会被清除,作业重新分片 |
失败处理策略 | 支持异常检测和失败转移,超时报警,超时强杀 | 调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; | 弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能。 |
监控告警 | 支持,需要自己接口实现 | 任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔 | 通过事件订阅方式可自行实现 |
日志可追溯 | 支持日志查看,同时支持jstack和gc log备份到executor日志目录(executor版本大于3.0.0) | 支持,有日志查询界面 | 可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。Elastic-Job目前提供了基于关系型数据库两种事件订阅方式记录事件。 |
触发规则 | 时间、事件触发 | 时间、事件触发 | 时间触发 |
DAG | 支持作业编排,作业编排将作业形成一个有向无环图,按照图的顺序依次调用。 | 支持简单的子任务和任务依赖,不支持完整的DAG任务 | 计划支持 |
管理界面 | 同Elastic-Job,可以进行任务重启,并提供了一键摘流量、一键dump等Executor运维功能 | 进行任务创建、编辑,编辑GLUE代码,操作作业禁用\启用、停止和删除等生命周期,可以查看调度日志,任务进度监控,任务依赖,数据加密,邮件报警(提供了钉钉报警API,可以进行二次开发),运行报表,国际化 | 有运维平台,提供了快捷修改作业设置,作业和服务器维度状态查看,操作作业禁用\启用、停止和删除等生命周期,但停止的任务不可以重启,无报警机制 |
容器部署 | Docker | Docker | 计划支持 |
缺点 | 需要引入zookeeper , mesos, 增加系统复杂度, 学习成本较高 | 调度中心通过获取 DB锁来保证集群中执行任务的唯一性, 如果短任务很多,随着调度中心集群数量增加,那么数据库的锁竞争会比较厉害,性能不好。 | 需要引入zookeeper , mesos, 增加系统复杂度, 学习成本较高 |
部署运维 | 复杂 | 简单 | 复杂 |
难易程度 | 复杂 | 简单 | 复杂 |
GitHub上star数 | 1.9k | 15.6k | 6.5k |
License | Apache License 2.0 | GNU General Public License v3.0 | Apache License 2.0 |
文档 | 一般 | 比较完善 | 比较完善 |
社区 | 一般,更新慢 | 比较活跃,更新快 | 重新活跃起来,更新比较快 |
开源时间 | 2016.12 | 2015.12 | 2015.9 |
开源组织 | 唯品会 | 大众点评 | 当当网,2020.6,成为Apache ShardingSphere的子项目,正式迁入Apache仓库 |
以DAG为核心的工作流调度系统对比
feature | Apache DolphinScheduler | Apache Airflow | Azkaban |
---|---|---|---|
单点故障 | 去中心化的多Master和多Worker | 是,单一调度程序 | 是,单个Web和调度程序组合节点 |
HA额外要求 | 不需要(本身就支持HA) | Celery / Dask / Mesos + Load Balancer + DB | DB |
过载处理 | 任务队列机制,单个机器上可调度的任务数量可以灵活配置,当任务过多时会缓存在任务队列中,不会造成机器卡死 | 任务太多时会卡死服务器 | 任务太多时会卡死服务器 |
DAG监控界面 | 任务状态、任务类型、重试次数、任务运行机器、可视化变量等关键信息一目了然 | 不能直观区分任务类型 | 只能看到任务状态 |
可视化流程定义 | 是,所有流程定义操作都是可视化的,通过拖拽任务来绘制DAG,配置数据源及资源。同时对于第三方系统,提供api方式的操作。 | 否,通过python代码来绘制DAG,使用不便,特别是对不会写代码的业务人员基本无法使用。 | 否,通过自定义DSL绘制DAG并打包上传 |
是否能暂停和恢复 | 支持暂停,恢复操作 | 否,只能先将工作流杀死再重新运行 | 否,只能先将工作流杀死再重新运行 |
是否支持多租户 | 支持,easyscheduler上的用户可以通过租户和hadoop用户实现多对一或一对一的映射关系,这对大数据作业的调度是非常重要的。 | 否 | 否 |
任务类型 | 支持传统的shell任务,同时支持大数据平台任务调度: MR、Spark、SQL(mysql、postgresql、hive、sparksql)、Python、Procedure、Sub_Process | BashOperator、DummyOperator、MySqlOperator、HiveOperator、EmailOperator、HTTPOperator、SqlOperator | shell、gobblin、hadoopJava、java、hive、pig、spark、hdfsToTeradata、teradataToHdfs |
与大数据契合度 | 支持大数据作业spark,hive,mr的调度,同时由于支持多租户,与大数据业务更加契合 | 由于不支持多租户,在大数据平台业务使用不够灵活 | 由于不支持多租户,在大数据平台业务使用不够灵活 |
是否支持自定义任务类型 | 是 | 是 | 是 |
是否支持集群扩展 | 是,调度器使用分布式调度,整体的调度能力会随便集群的规模线性增长,Master和Worker支持动态上下线 | 是,但是复杂Executor水平扩展 | 是,但是复杂Executor水平扩展 |
部署运维 | 一键部署 | 集群化部署复杂 | 集群化部署复杂 |
难易程度 | 简单 | 复杂 | 复杂 |
GitHub上star数 | 4.4k | 18.3k | 3.4k |
License | Apache License 2.0 | Apache License 2.0 | Apache License 2.0 |
文档 | 完善 | 比较完善 | 完善 |
社区 | 活跃,更新快 | 比较活跃,更新快 | 比较活跃,更新快 |
开源时间 | 2019.9 | 2014.10 | 2014.1 |
开源组织 | 易观开源,Apache | Apache |
后记:本次分享到此结束,本人水平有限,难免有错误或遗漏之处,望大家指正和谅解,欢迎评论留言。