分布式定时任务框架Elastic-Job的使用

为什么80%的码农都做不了架构师?>>>   hot3.png

一、前言

    Elastic-Job是一个优秀的分布式作业调度框架。

    Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

    Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

    Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。

1. Elastic-Job-Lite

  • 分布式调度协调

  • 弹性扩容缩容

  • 失效转移

  • 错过执行作业重触发

  • 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例

  • 自诊断并修复分布式不稳定造成的问题

  • 支持并行调度

  • 支持作业生命周期操作

  • 丰富的作业类型

  • Spring整合以及命名空间提供

  • 运维平台

2. Elastic-Job-Cloud

  • 应用自动分发

  • 基于Fenzo的弹性资源分配

  • 分布式调度协调

  • 弹性扩容缩容

  • 失效转移

  • 错过执行作业重触发

  • 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例

  • 支持并行调度

  • 支持作业生命周期操作

  • 丰富的作业类型

  • Spring整合

  • 运维平台

  • 基于Docker的进程隔离(TBD)

二、导读

    1、Elastic-Job的核心思想

    2、Elastic-Job的基本使用

三、Elastic-Job的核心思想

    对于分布式计算而言,分片是最基本的思想,Elastic-Job也是沿用了这个思想,每个job跑部分数据,所有job执行完成,便是全量数据,官网给出的SimpleJob例子如下:

public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0: // do something by sharding item 0break;case 1: // do something by sharding item 1break;case 2: // do something by sharding item 2break;// case n: ...}}
}

    用switch case循环来对应分片的业务逻辑,case分片的index,进入业务逻辑执行。当然这里也有不适应的场景,类似于MapReduce需要shuffle的场景就不适合了,比方说,要根据某一个字段全局分组聚合求结果,这时候怎么分片都可能会不合理,因为每个分片只能处理N分之一的数据,没办法shuffle再聚合,这一点,也要根据具体的业务来使用。

   那么ShardingContext可以拿到那些信息呢?源码如下

    

public final class ShardingContext {/*** 作业名称.*/private final String jobName;/*** 作业任务ID.*/private final String taskId;/*** 分片总数.*/private final int shardingTotalCount;/*** 作业自定义参数.* 可以配置多个相同的作业, 但是用不同的参数作为不同的调度实例.*/private final String jobParameter;/*** 分配于本作业实例的分片项.*/private final int shardingItem;/*** 分配于本作业实例的分片参数.*/private final String shardingParameter;public ShardingContext(final ShardingContexts shardingContexts, final int shardingItem) {jobName = shardingContexts.getJobName();taskId = shardingContexts.getTaskId();shardingTotalCount = shardingContexts.getShardingTotalCount();jobParameter = shardingContexts.getJobParameter();this.shardingItem = shardingItem;shardingParameter = shardingContexts.getShardingItemParameters().get(shardingItem);}
}

    以上代码,jobParameter和shardingItem是最有用的参数,shardingItem决定switch case循环的走向,shardingParameter可以用业务的查询条件,也可以用字符串拼接的方式组装很复杂的参数用于特定的业务。

四、Elastic-Job的基本使用

    1、Job配置项

public class ElasticJobConfig {private static CoordinatorRegistryCenter createRegistryCenter() {ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("127.0.0.1:2181", "elastic-job");CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);regCenter.init();return regCenter;}private static LiteJobConfiguration createJobConfiguration() {JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("jobdemo", "0/5 * * * * ?", 3).shardingItemParameters("0=A,1=A,2=B").failover(true).misfire(true).build();SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig,MyElasticJob.class.getCanonicalName());LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();return simpleJobRootConfig;}public static void main(String[] args) {new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();}
}

    几点说明:

    注册中心配置项,设置zookeeper集群地址,我这里用的本地单节点,所以只有一个,当然可以配置任务名称,命名空间(namespace,本质上会在zk里生成一个目录),超时时间,最大重试次数等等

    LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build()中,overwrite参数非常重要,设置这个参数为true,修改过job配置信息才会覆盖zookeeper里的数据,要不然不会生效。

    2、SimpleJob的实现

public class MyElasticJob implements SimpleJob {@Overridepublic void execute(ShardingContext shardingContext) {switch (shardingContext.getShardingItem()) {case 0: {System.out.println("当前分片:" + shardingContext.getShardingItem() + "=====" + "参数:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}case 1: {System.out.println("当前分片:" + shardingContext.getShardingItem() + "=====" + "参数:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}case 2: {System.out.println("当前分片:" + shardingContext.getShardingItem() + "=====" + "参数:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}default: {System.out.println("当前分片:" + shardingContext.getShardingItem() + "=====" + "参数:"+ shardingContext.getShardingParameter() + " =====" + Thread.currentThread());break;}}}
}

    上面设置每5秒钟执行一次,执行ElasticJobConfig的main方法,执行结果如下:

    e2f825efa854fc514fa69bd305ce79df77c.jpg

    从上面的结果,可以看出,执行每个分片的任务,其实是放到一个线程池去执行的,对应的分片信息和参数信息在shardingContext可以拿到,实现业务非常方便。

    最后,如果启动多个JVM,那么这些任务就分散到各个节点里,如果一个节点宕机,下次触发任务时,将把该分片任务丢到健康机器执行,这里做到了节点容错。但是某个分片的任务在执行过程中失败了,那么这里是不会重新触发改分片任务的执行的。

 

 

    

转载于:https://my.oschina.net/u/1778239/blog/3018941

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Memcached和Redis

Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放在一起做一下对比的介绍 基本架构和思想 首先简单介绍一下两者的…

第4章 springboot热部署 4-1 SpringBoot 使用devtools进行热部署

/imooc-springboot-starter/src/main/resources/application.properties #关闭缓存, 即时刷新 #spring.freemarker.cachefalse spring.thymeleaf.cachetrue#热部署生效 spring.devtools.restart.enabledtrue #设置重启的目录,添加那个目录的文件需要restart spring.devtools.r…

border-radius 涨知识的写法

<div idapp></div>复制代码#app{width:100%;height:80px;background:pink;border-radius:75%/20% 20% 0 0;}复制代码仅供自己总结记忆转载于:https://juejin.im/post/5c80afd66fb9a049f81a1217

ibm python db_使用IBM HR Analytics数据集中的示例的Python独立性卡方检验

ibm python dbSuppose you are exploring a dataset and you want to examine if two categorical variables are dependent on each other.假设您正在探索一个数据集&#xff0c;并且想要检查两个分类变量是否相互依赖。 The motivation could be a better understanding of …

Oracle优化检查表

分类检查项目相关文件或结果状态备注日志及文件Oracle Alert 日志bdump/udump下是否存在明显的报警listener相关日志SQL* Net日志参数/参数文件listener.ora/tnsnames.ora操作系统操作系统版本检查操作系统补丁节点名操作系统vmstat状态操作系统I/O状态操作系统进程情况操作系统…

spring分布式事务学习笔记(2)

此文已由作者夏昀授权网易云社区发布。欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。Model类如下&#xff1a;package com.xy.model1 package com.xy.model;2 3 /**4 * Created by helloworld on 2015/1/30.5 */6 public class NameQa {7 private long …

sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平

sql 左联接 全联接The last couple of blogs that I have written have been great for beginners ( Data Concepts Without Learning To Code or Developing A Data Scientist’s Mindset). But, I would really like to push myself to create content for other members of …

如何查看linux中文件打开情况

如何查看linux中文件打开情况 前言 我们都知道&#xff0c;在linux下&#xff0c;“一切皆文件”&#xff0c;因此有时候查看文件的打开情况&#xff0c;就显得格外重要&#xff0c;而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。 linux下有哪些文件 在介绍lsof命…

hadoop windows

1、安装JDK1.6或更高版本 官网下载JDK&#xff0c;安装时注意&#xff0c;最好不要安装到带有空格的路径名下&#xff0c;例如:Programe Files&#xff0c;否则在配置Hadoop的配置文件时会找不到JDK&#xff08;按相关说法&#xff0c;配置文件中的路径加引号即可解决&#xff…

Ocelot中文文档入门

入门 Ocelot仅适用于.NET Core&#xff0c;目前是根据netstandard2.0构建的&#xff0c;如果Ocelot适合您&#xff0c;这个文档可能会有用。 .NET Core 2.1 安装NuGet包 使用nuget安装Ocelot及其依赖项。 您需要创建一个netstandard2.0项目并将其打包到其中。 然后按照下面的“…

科学价值 社交关系 大数据_服务的价值:数据科学和用户体验研究美好生活

科学价值 社交关系 大数据A crucial part of building a product is understanding exactly how it provides your customers with value. Understanding this is understanding how you fit into the lives of your customers, and should be central to how you build on wha…

在Ubuntu下创建hadoop组和hadoop用户

一、在Ubuntu下创建hadoop组和hadoop用户 增加hadoop用户组&#xff0c;同时在该组里增加hadoop用户&#xff0c;后续在涉及到hadoop操作时&#xff0c;我们使用该用户。 1、创建hadoop用户组 2、创建hadoop用户 sudo adduser -ingroup hadoop hadoop 回车后会提示输入新的UNIX…

day06 hashlib模块

1.hashlib模块 import hashlib# password123456# print( password.encode()) #加密前先转成二进制# mhashlib.md5(password.encode())# print(dir(m)) #查询m的所有方法## print(m.hexdigest()) #使用hexdigest()方法加密&#xff0c;md5加密之后是不可逆&#xff0c;不可以解…

vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。

vs azure webWebscraping as a required skill for many data-science related jobs is becoming increasingly desirable as more companies slowly migrate their processes to the cloud.随着越来越多的公司将其流程缓慢迁移到云中&#xff0c;将Web爬网作为许多与数据科学相…

hadoop eclipse windows

首先说一下本人的环境: Windows7 64位系统 Spring Tool Suite Version: 3.4.0.RELEASE Hadoop2.6.0 一&#xff0e;简介 Hadoop2.x之后没有Eclipse插件工具&#xff0c;我们就不能在Eclipse上调试代码&#xff0c;我们要把写好的java代码的MapReduce打包成jar然后在Linux上运…

同步函数死锁现象

多线程&#xff1a;一个进程中有多个线程可以同时执行任务 多线程的好处&#xff1a; 1、解决一个进程中可以同时执行多个任务的问题。 2、提高了资源利用率 多线程的弊端&#xff1a; 1、增加了CPU的负担 2、降低了一个进程中线程的执行概率 3、出现了线程安全问题 4、会引发死…

netstat 在windows下和Linux下查看网络连接和端口占用

假设忽然起个服务&#xff0c;告诉我8080端口被占用了&#xff0c;OK&#xff0c;我要去看一下是什么服务正在占用着&#xff0c;能不能杀 先假设我是在Windows下&#xff1a; 第一列&#xff1a; Proto 协议 第二列&#xff1a; 本地地址【ip端口】 第三列&#xff1a;远程地址…

selenium 解析网页_用Selenium进行网页搜刮

selenium 解析网页网页抓取系列 (WEB SCRAPING SERIES) 总览 (Overview) Selenium is a portable framework for testing web applications. It is open-source software released under the Apache License 2.0 that runs on Windows, Linux and macOS. Despite serving its m…

表的设计与优化

单表设计与优化 1&#xff09;设计规范化表&#xff0c;消除数据冗余&#xff08;以使用正确字段类型最明显&#xff09;&#xff1a; 数据库范式是确保数据库结构合理&#xff0c;满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表&#xff0c;称为规范…

代理ARP协议(Proxy ARP)

代理ARP&#xff08;Proxy-arp&#xff09;的原理就是当出现跨网段的ARP请求时&#xff0c;路由器将自己的MAC返回给发送ARP广播请求发送者&#xff0c;实现MAC地址代理&#xff08;善意的欺骗&#xff09;&#xff0c;最终使得主机能够通信。 图中R1和R3处于不同的局域网&…