古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。

认识任务调度系统和工作流框架

大数据与AI admin 751℃ 0评论

在大型系统中,任务调度是一项基础性的需求。对于一些需要重复、定时执行或者耗时比较长的任务经常会被剥离出来单独处理,而随着任务规模与复杂性的上升,任务调度系统也就随需而生。设计良好的任务调度系统具备可靠性及伸缩性,它可以管理并监控任务的执行流程,以保证任务的正确执行。当前,分布式调度在互联网企业中占据着十分重要的作用,尤其是电子商务领域,由于存在数据量大、高并发的特点,对数据处理的要求较高,既要保证高效性,也要保证准确性和安全性,相对比较耗时的业务逻辑往往会从中剥离开来进行异步处理。

认识调度器

认识任务调度系统可以从调度器开始,调度器是调度系统非常核心和普遍的组件,其内涵比较宽广,也比较模糊。

一般来说,下面提到的几种类型的模块都可以认为是调度器:

  • 早期计算机系统当中的批处理调度系统;
  • 现代计算机系统当中的抢占式进程调度系统和内存分配系统;
  • 某些系统或程序提供或实现的,定时激发某些类型操作的工具(如 crontab、Quartz 等);
  • 某些编程语言的 Runtime 提供的线程/纤程/协程调度器(如 Golang 内置的Goroutine 调度器);
  • 分布式系统当中的任务关系管理和调度执行系统,(如 Hadoop YARN, Airflow 等);
  • 分布式系统当中的资源管理和调度系统(如 Mesos、Borg、Kubernetes 的调度器等)。

可以被称为调度器的工具涵盖范围非常广,他们有的提供定时激发任务的能力,有的提供资源管理的能力,有的负责维护任务的依赖关系和执行顺序,甚至有的系统还集成了任务监控和各种指标度量的工具。

定时任务

任务调度可以说是所有系统都必须要依赖的一个中间系统,主要负责触发一些需要定时执行的任务。 定时任务是解决某一特定的时刻去做某件任务的业务场景。一般来说,系统可以使用消息传递(消息队列)代替部分定时任务,两者有很多相似之处,可以相互替换场景。如,上面发货成功发短信通知客户的业务场景,我们可以在发货成功后发送MQ消息到队列,然后去消费MQ消息,发送短信。

但在某些场景下不能互换:

a)时间驱动/事件驱动:内部系统一般可以通过时间来驱动,但涉及到外部系统,则只能使用时间驱动。如怕取外部网站价格,每小时爬一次;
b)批量处理/逐条处理:批量处理堆积的数据更加高效,在不需要实时性的情况下比消息中间件更有优势。而且有的业务逻辑只能批量处理。如移动每个月结算我们的话费;
c)实时性/非实时性:消息中间件能够做到实时处理数据,但是有些情况下并不需要实时,比如:vip升级;
d)系统内部/系统解耦:定时任务调度一般是在系统内部,而消息中间件可用于两个系统间;

定时任务的调度无论是单机还是分布式都离不开“定时器”,其底层实现方案有很多种,有兴趣可以了解参考文献中的《 定时器的几种实现方式 》。

任务调度系统的概念


在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券;比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。

上述定时任务常见的处理方式有线程的while(true) 和sleep组合、使用Timer定时器触发任务又或者是使用quartz框架,都属于单机定时任务调度系统, 在分布式系统中,这样做的话,就会面临任务重复执行的问题(多台服务器都会触发),另外分布式任务调度系统也需要一个统一的任务管理中心来解决任务配置混乱的问题。

任务调度系统在分布式或大数据平台中扮演的作用和角色如下:

  • 任务编排: 对任务流按照一定的逻辑串起来。这在大数据开发中,显得比较重要,对于一个工作任务,可能有不同的子任务串起来的,并且有些子任务是并行执行的。举个例子,在做一个机器学习的模型时,可能第一步就是数据清洗,然后是提取特征,接着才是模型预测。然后提取特征的过程中,可能要分为提取属性特征和行为特征。那么这里用拓扑图可以表示为如下图:
  • 任务调度执行:任务调度组件的核心使命肯定是让离线任务按照我们既定的执行计划去周期调度地执行。那么任务调度系统就需要能够按照任务的调度计划去自动执行任务。
  • 运维功能:作为一个系统肯定要有健全的运维功能,比如说提供任务运行报表功能,调度日志等等,如下图所示:

调度系统分类、对比

如上文提到的,按照参与任务调度机器的数量我们可以将调度系统划分为单机和分布式两类。

1. 单机定时任务调度系统

主要包括Timer、ScheduledExecutor 、JCronTab 和开源工具包Quartz等技术方案,比较主流的是Quartz,它是一个开源的Java库,可以看做以上三种结合的扩展。

  • 对于简单的基于起始时间点与时间间隔的任务调度,使用 Timer 就足够了;
  • 如果需要同时调度多个任务,基于线程池的 ScheduledTimer 是更为合适的选择;
  • 当任务调度的策略复杂到难以凭借起始时间点与时间间隔来描述时,Quartz 与 JCronTab 则体现出它们的优势。
  • 熟悉 Unix/Linux 的开发人员更倾向于 JCronTab,且 JCronTab 更适合与 Web 应用服务器相结合。Quartz 的 Trigger 与 Job 松耦合设计使其更适用于 Job 与 Trigger 的多对多应用场景。

单机定时任务调度系统的不足:

(1)高可用:单机版的定式任务调度只能在一台机器上运行,如果程序或者系统出现异常就会导致功能不可用。虽然可以在单机程序实现的足够稳定,但始终有机会遇到非程序引起的故障,而这个对于一个系统的核心功能来说是不可接受的。

(2)单机处理极限:原本1分钟内需要处理1万个订单,但是现在需要1分钟内处理10万个订单;原来一个统计需要1小时,现在业务方需要10分钟就统计出来。你也许会说,你也可以多线程、单机多进程处理。的确,多线程并行处理可以提高单位时间的处理效率,但是单机能力毕竟有限(主要是CPU、内存和磁盘),始终会有单机处理不过来的情况。

2. 分布式定时任务调度系统

分布式任务调度系统有三个关键内容:分布式( 平台是分布式部署的,各个节点之间可以无状态和无限的水平扩展)、任务调度( 涉及到任务状态管理、任务调度请求的发送与接收、具体任务的分配、任务的具体执行)、配置中心(可以感知整个集群的状态、任务信息的注册)。

事实上,在分布式系统中,调度的概念比较广泛。主要包括以下 2 种:

  • 任务之间的调度,负责管理任务间的关系,典型系统 / 组件包括 Hadoop YARN 中的 Application Master 和 Airflow。
  • 任务资源调度,负责为任务分配资源,典型系统包括 Google Borg、Mesos、Kubernetes 等。

2.1 常用主流分布式定时任务调度系统框架

  • Quartz
  • TBSchedule
  • elastic-job
  • Saturn
  • xxl-job
  • azkaban

2.2 分布式定时任务调度系统框架对比

更加详细的对比内容可以了解参考文献中的《分布式调度框架大集合》。

工作流框架

总的来说,工作流框架(或叫工作流引擎)也是一种任务调度系统,特点是任务之间有依赖关系,有些依赖某个时间点去执行,有些依赖数据或者外部的事件来执行。

工作流框架主要功能包括:

  • DAG定义 (DAG的定义方式:表达式,脚本定义,通过WEB UI定义;还需要支持子DAG);
  • 执行节点 (节点类型:unix cmd,shell,python,mapreduce, logging etc…);
  • 节点控制(ignore, retry, suspend, run now, test mode);
  • Metrics (需要对比一段时间内任务的运行时间);
  • Monitor (失败策略,报警通知功能);
  • CLI & Web UI (查询workflow执行情况,以及简单的控制);

工作流框架汇总合集

工作流框架非常多,主流的包括Airflow、Azkaban、Conductor、Oozie和 Amazon Step Functions等。以下列出的两个链接提供了框架汇总合集。

Airflow

Airflow是Airbnb开源的DAG任务调度系统,用于管理,调度和监控工作流。它与Luigi,Pinball很像。后端是基于Flask,Celery,RabbitMQ/Redis。

Airflow的功能很多,对于工作流可以支持Cron语法调度,失败重试策略,各种任务依赖调度策略等。Airflow的一大亮点是backfill功能,对于数据仓库这种应用很有帮助,可以指定开始时间,将一个时间范围的任务重跑。Airflow还提供了丰富的命令行CLI和UI供操作。Airflow通过Celery来实现分布式调度,架构的设计上很清晰,利于扩展。

技术选型建议

没有一个系统是能完全满足需求的,每个公司都会根据自己的需求进行定制化调度,选择一个架构合理,利于扩展的开源系统修改是不错的选择。

参考文献

转载请注明:北凉柿子 » 认识任务调度系统和工作流框架

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 干货
    小毛球2019-05-08 15:09 回复