分布式任务调度系统

本文所说分布式调度中心,等同于分布式定时任务。单机环境下,可以参考Java基础之定时任务调度

同样地,Linux系统也有这一概念,参考我的博文Linux学习之定时任务

定时器技术

crontab

crontab是类UNIX系统的一个命令,用于设置需要周期性执行的指令,有对应的crontab文件。crontab储存的指令被守护进程crond激活。分为两类:

  • 系统任务调度:系统级别,存在/etc/etc下子目录,管理员编辑权限;
  • 用户任务调度,用户级别, 存在/var/spool/cron目录下,文件名与用户名一致。

crontab文件的配置格式:

crontab的命令行常用选项:

JDK Timer

单线程,Timer类,TimerTask类及其几种任务调度方法;
缺陷:
时间不准确延迟:
异常终止:
执行周期任务时依赖系统时间:

ScheduledExecutor

基于线程,实现类ScheduledThreadPoolExecutor,是一个线程池,常用的4种调度方式:

相对于Timer的优势:

  • 并发执行
  • 线程隔离
  • 与系统时间无关
  • 执行过程中抛出异常则会终止,不会影响其他任务,业务层捕获异常

spring scheduler

TaskExecutor、TaskScheduler、Trigger三个抽象接口,

问题

在使用Spring @Scheduled时,遇到的一个报错:
spring schedule issue IllegalStateException: Encountered invalid @Scheduled method '': For input string
把注解的cron表达式:@Scheduled(cron = "0 /10 * * * ?")修改为@Scheduled(cron = "0 0/10 * * * ?"),解决问题。

Quartz

Job、JobDetail、Trigger、Scheduler;
quartz整合spring;
quartz整合spring boot;

cron表达式

分布式需求

业务量大,数据量大,节点多等等情况促成分布式定时任务的产生。其核心问题:某个定时任务在一个触发时刻仅有一台服务器在运行。
解决方案:

  1. 单服务器执行所有任务,pass(单点故障,任务量大,效率不够……)
  2. 配置参数分散运行,增加运维管理配置参数的难度,单点问题依然存在。
  3. 全局锁互斥执行,抢占执行,某个节点获取到任务key对应的锁,则执行任务,否则不执行,解决多节点重复执行的问题。
    分布式定时任务的处理方式:抢占式、协同式;
    特点:高可用性,可伸缩性,负载均衡,失效转移;
    核心:分布式锁,利用互斥来防止彼此干扰来保证一致性。

分布式锁的三种实现方式:

  1. 基于数据库;
  2. 基于redis;
  3. 基于zookeeper,简称zk;

zk,内部是一个分层的文件系统目录树结构,规定在同一个目录下面只能有一个唯一文件名。节点类型:永久节点,临时节点,顺序节点。监视器watcher。实现分布式锁的步骤:

开源产品

quartz分布式

只有使用JobStore的quartz才具有集群功能。jar包里面有数据库脚本,表明和作用略(12张表),quartz.propertiesspring-quartz.xml配置文件;quartz通过数据库实现分布式锁机制。表QRTZ_LOCKS,行锁表,悲观锁;两种存储方式,RAMJobStore(内存),以及JobStoreSupport(JDBC,数据库)。
被错过执行的job,misfired job,可能的原因:

  1. 系统重启;
  2. Trigger被暂停(suspend);
  3. 线程池中所有的线程都被占用,导致任务无法被触发执行;
  4. 有状态任务(StatefulJob)在下次触发时间到达时,上次的任务还没有结束。
    应对策略:

spring batch?

XXL-JOB

个人开源,主要分为调度中心和执行器两部分,调度中心在启动初始化时,会默认生成执行器的RPC代理。对象(http协议调用),执行器项目启动之后,调度中心在触发定时器之后通过jobHandle 来调用执行器项目里面的代码。
参考分布式任务系统XXL-JOB

ElasticJob

Github:https://github.com/apache/shardingsphere-elasticjob
官站:https://shardingsphere.apache.org/elasticjob/index_zh.html
ElasticJob是当当网基于Quartz + ZooKeeper二次开发后的分布式调度解决方案,包括两个相对独立的子项目,一般只用Elastic-Job-Lite:

  • Elastic-Job-Lite:定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务
  • Elastic-Job-Cloud:使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务

亮点:

  • 基于Quartz定时任务框架为基础的,具备Quartz的大部分功能
  • 使用zk做协调&调度中心,轻量级
  • 支持任务分片
  • 支持弹性扩容,可水平扩展 , 当任务再次运行时,会检查当前的服务器数量,重新分片,分片结束之后才会继续执行任务
  • 失效转移,容错处理,当一台调度服务器宕机或跟zk断开连接之后,会立即停止作业,然后再去寻找其他空闲的调度服务器,来运行剩余的任务
  • 提供运维界面,可以管理作业和注册中心

ElasticJob-Lite 的架构设计:
在这里插入图片描述
ElasticJob没有调度中心这一概念,而是使用ZK作为注册中心,注册中心负责协调分配任务到不同的节点上。ElasticJob中的定时调度都是由执行器自行触发,去中心化设计(调度和处理都是执行器单独完成)。

@Component
@ElasticJobConf(name = "dayJob", cron = "0/10 * * * * ?", shardingTotalCount = 2,
        shardingItemParameters = "0=AAAA,1=BBBB", description = "简单任务", failover = true)
public class TestJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        log.info("TestJob任务名:【{}】, 片数:【{}】, param=【{}】", shardingContext.getJobName(), shardingContext.getShardingTotalCount(), shardingContext.getShardingParameter());
    }
}

优缺点:
优点:可与 Spring 集成、支持分布式、支持集群、性能不错
缺点:依赖额外的中间件如 Zookeeper,复杂度增加,可靠性降低、维护成本变高

TBSchedule

Azkaban

参考Azkaban入门笔记,LinkedIn开源的分布式工作流调度框架,目地在于解决Hadoop Jop依赖管理问题,但实际已经是一个通用的工作流调度框架,适用于不同业务场景。重心则在工作流调度,通过DSL语法定义工作流,支持子工作流,子工作流可以在主工作流中调度,也可单独调度。

Airflow

Airbnb开源的一款数据流程工具,Apache顶级项目。以非常灵活的方式来支持数据的ETL过程,支持非常多的插件来完成诸如HDFS监控、邮件通知等功能。Airflow支持单机和分布式两种模式,支持Master-Slave模式,支持Mesos等资源调度,有非常好的扩展性。基于Dag也可以定义复杂的工作流,属于Python技术栈。

Apache DolphinScheduler

对比

功能xxl-jobAzkabanAirflow
licenseGNU General Public License v3.0Apache License V2.0Apache License V2.0
调度模块QuartzQuartz自实现
调度中心HA支持,Quartz集群不支持不支持
执行器HA支持支持支持
业务耦合度高,业务逻辑在执行器中实现低,与实际业务无耦合低,与实际业务无耦合
Job类型Java、Shell、Python、NodeJS、PHP、PowerShellCommand、HadoopShell、Java、HadoopJava、Pig、Hive等,支持插件式扩展Python、Bash、HTTP、MySQL等,支持Operator的自定义扩展
Executor触发RPCRestfulRestful
工作流无,可配置任务级联触发支持,自定义DSL语法支持,基于Python DAG
管理界面简单但不美观简单,美观程度略胜于xxl-job,整体功能逻辑清晰,上手简单该有的功能都有,但是就是让你用得不爽。
部署运维简单简单较复杂,包括WebServer、Scheduler、Worker和Flower(可选)
单点故障Web Server存在单点故障风险Scheduler存在单点故障风险

参考

Java任务调度
Linux学习之进程调度
Azkaban、Xxl-Job与Airflow对比分析

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Apache DolphinScheduler是一个新一代分布式大数据工作流任务调度系统,致力于“解决大数据任务之间错综复杂的依赖关系,整个数据处理开箱即用”。它以 DAG(有向无环图) 的方式将任务连接起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及 Kill任务等操作。目前已经有像IBM、腾讯、美团、360等400多家公司生产上使用。 调度系统现在市面上的调度系统那么多,比如老牌的Airflow, Oozie,Kettle,xxl-job ,Spring Batch等等, 为什么要选DolphinScheduler ? DolphinScheduler 的定位是大数据工作流调度。通过把大数据和工作流做了重点标注. 从而可以知道DolphinScheduler的定位是针对于大数据体系。DolphinScheduler 发展很快 很多公司调度都切换到了DolphinScheduler,掌握DolphinScheduler调度使用势在必行,抓住新技术机遇,为跳巢涨薪做好准备。 优秀的框架都是有大师级别的人写出来的,包含了很多设计思想和技术。DolphinScheduler也不例外,它是一个非常优秀的框架,用到很多技术和设计思想,本课程会带大家深入DolphinScheduler框架源码,包括设计的思想和技术都会讲解,DolphinScheduler源码很多,会按照模块进行讲解,学习完课程后,不仅可以熟悉DolphinScheduler使用,而且可以掌握很多优秀的设计思想和技术,给自己的技术带来很大提升,为跳巢涨薪做好准备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

johnny233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值