分布式作业 Elastic-Job 快速上手指南,从理论到实战一文搞定!
Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建议使用 Spring 配置文件的形式。
Elastic-Job 需要依赖 Zookeeper 中间件,用于注册和协调作业分布式行为的组件,目前仅支持 Zookeeper。我们已经创建了 Zookeeper 集群!
环境要求
1、Java 请使用 JDK 1.7 及其以上版本。
2、Zookeeper 请使用 Zookeeper 3.4.6 及其以上版本。
3、Maven 请使用 Maven 3.0.4 及其以上版本。
引入maven依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
这里有一个坑,这个依赖里面会包含有两个不同版本的 curator-client,导致调用里面方法的时候会找不到方法,所以需要单独引入 curator-client 的依赖包。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.11.1</version>
</dependency>
创建作业
Elastic-Job 提供 Simple、Dataflow 和 Script 3种作业类型。
方法参数 shardingContext 包含作业配置、片和运行时信息。可通过 getShardingTotalCount(), getShardingItem() 等方法分别获取分片总数,运行在本作业服务器的分片序列号等。
这里我们创建一个简单(Simple)作业。
public class MyElasticJob implements SimpleJob {
@Override
public void execute(ShardingContext context) {
switch (context.getShardingItem()) {
case 0: {
System.out.println("MyElasticJob - 0");
break;
}
case 1: {
System.out.println("MyElasticJob - 1");
break;
}
case 2: {
System.out.println("MyElasticJob - 2");
break;
}
default: {
System.out.println("MyElasticJob - default");
}
}
}
}
上面的0-2涉及分布式作业框架中分片的概念
任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。
例如:有一个遍历数据库某张表的作业,现有2台服务器。为了快速的执行作业,那么每台服务器应执行作业的50%。为满足此需求,可将作业分成2片,每台服务器执行1片。作业遍历数据的逻辑应为:服务器A遍历ID以奇数结尾的数据;服务器B遍历ID以偶数结尾的数据。如果分成10片,则作业遍历数据的逻辑应为:每片分到的分片项应为ID%10,而服务器A被分配到分片项0,1,2,3,4;服务器B被分配到分片项5,6,7,8,9,直接的结果就是服务器A遍历ID以0-4结尾的数据;服务器B遍历ID以5-9结尾的数据。
作业分片策略:http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/
配置作业
Elastic-Job 配置分为3个层级,分别是 Core, Type 和 Root,每个层级使用相似于装饰者模式的方式装配。
Core 对应 JobCoreConfiguration,用于提供作业核心配置信息,如:作业名称、分片总数、CRON表达式等。
Type 对应 JobTypeConfiguration,有3个子类分别对应 SIMPLE, DATAFLOW 和 SCRIPT 类型作业,提供3种作业需要的不同配置,如:DATAFLOW 类型是否流式处理或 SCRIPT 类型的命令行等。
Root 对应 JobRootConfiguration,有2个子类分别对应 Lite 和 Cloud 部署类型,提供不同部署类型所需的配置,如:Lite类型的是否需要覆盖本地配置或 Cloud 占用 CPU 或 Memory 数量等。
在 Spring Boot 启动类里面加作业配置代码。
private static CoordinatorRegistryCenter createRegistryCenter() {
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("192.168.10.31:2181,192.168.10.32:2181,192.168.10.33:2181", "elastic-job-demo"));
regCenter.init();
return regCenter;
}
private static LiteJobConfiguration createJobConfiguration() {
// 定义作业核心配置
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 10).build();
// 定义SIMPLE类型配置
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MyElasticJob.class.getCanonicalName());
// 定义Lite作业根配置
LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
}
@Bean
public CommandLineRunner commandLineRunner() {
return (String... args) -> {
new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();
};
}
SimpleJobConfiguration 实现了JobTypeConfiguration接口。
LiteJobConfiguration 实现了JobRootConfiguration接口。
使用CommandLineRunner,可以等 Spring Boot 启动后再启动 Elastic-Job 作业。
其他的最基础的 Spring Boot 的配置就不说了,不懂的可以去公众号菜单 Spring Boot 专题中学习。
更多作业的配置请参考官方文档:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/
启动作业
在工具里面使用 maven 命令 spring-boot:run 启动即可。
程序输出:
MyElasticJob - 0
MyElasticJob - 1
MyElasticJob - 2
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
由于是单个实例,所有 10 个分片都在一个实例输出来了,现在我们把它打成 jar 包,然后再用另外一个端口启动看下是否分片成功。
两边分别输出:
MyElasticJob - 0
MyElasticJob - 1
MyElasticJob - 2
MyElasticJob - default
MyElasticJob - default
和
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
上面的输出信息说明分片成功了,然后停掉一个项目后发现又自动触发分片,所有的都在同一个输出来了。
可以看出分片功能真的非常实用,作业开发起来真的很方便,整个架构也很清晰,推荐大家使用。
后面还更多的 Elastic-Job 实战干货请继续关注,觉得有用就动手分享鼓励一下我们吧!
分布式作业 Elastic-Job 快速上手指南,从理论到实战一文搞定!的更多相关文章
- 分布式作业 Elastic Job 如何动态调整?
前面分享了两篇分布式作业调度框架 Elastic Job 的介绍及应用实战. ElasticJob-分布式作业调度神器 分布式作业 Elastic Job 快速上手指南! Elastic Job 提供 ...
- Rancher 快速上手指南操作(1)
Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...
- UnityShader快速上手指南(三)
简介 这一篇还是一些基本的shader操作:裁剪.透明和法向量的应用 (纠结了很久写不写这些,因为代码很简单,主要是些概念上的东西) 先来看下大概的效果图:(从左到右依次是裁剪,透明,加了法向量的透明 ...
- [转]Rancher 快速上手指南操作(1)
本文转自:http://www.cppblog.com/zhiyewang/archive/2016/03/17/213053.aspx Rancher 快速上手指南操作(1)该指南知道用户如何快速的 ...
- Markdown快速上手指南
Markdown快速上手指南 1.Markdown介绍 markdown可以实现快速html文档编辑,格式优没,并且不需要使用html元素. markdown采用普通文本的形式,例如读书笔记等易于使用 ...
- OpenCV3.4.1快速集成到Android studio中,10分钟搞定
OpenCV3.4.1快速集成到Android studio中,10分钟搞定 转载 https://blog.csdn.net/yu540135101/article/details/8259 ...
- Elastic Search快速上手(1):简介及安装配置
前言 最近开始尝试学习Elastic Search,因此决定做一些简单的整理,以供后续参考,快速上手使用ES. 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多 ...
- Github Action 快速上手指南
前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...
- [Apache Pulsar] 企业级分布式消息系统-Pulsar快速上手
Pulsar快速上手 前言 如果你还不了解Pulsar消息系统,可以先看上一篇文章 企业级分布式消息系统-Pulsar入门基础 Pulsar客户端支持多个语言,包括Java,Go,Pytho和C++, ...
随机推荐
- MFC笔记7
1.VS中显示行号 工具 -> 选项 -> 文本编辑器 -> C/C++ -> 行号 2.VS中调整字体大小 工具 -> 选项 -> 环境->字体和颜色 3. ...
- C++ 11 创建和使用 unique_ptr
unique_ptr 不共享它的指针.它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法.只能移动unique_ptr.这意味着,内存资 ...
- eosjs
[eosjs] Javascript API,用于帮助访问与 EOSIO RPC API. 1.安装 npm install eosjs@beta 2.Signature Provider The S ...
- 人人开源框架使用 renren fast
参考地址人人开源官网: https://www.renren.io/guide/ 1.介绍 1.1.项目描述 renren-fast 是一个轻量级的 Spring Boot 快速开发平台,能快速开发项 ...
- 绑定checkedComboBox
using System; namespace CommonLib{ /// <summary> /// CommonCode 的摘要说明. /// </summary> [S ...
- Python设计模式 - UML - 部署图(Deployment Diagram)
简介 部署图也称配置图,用来显示系统中硬件和软件的物理架构.从中可以了解到软件和硬件组件之间的物理拓扑.连接关系以及处理节点的分布情况. 部署图建模步骤 - 找出需要进行部署的各类节点,如网络硬件设备 ...
- Cobbler安装CentOS7系统时报错 What do you want do now?
问题的根源: 在cobbler服务主机中执行了 createrepo --update /var/www/cobbler/ks_mirror/CentOS-7-x86_64/ 导致的. cobbl ...
- 查看SQL语句的真实执行计划
DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实的执行计划有助于更好的分析SQ ...
- 使用jmail发送短信
原文链接 https://blog.csdn.net/sdaujsj1/article/details/79248469 pom <!-- https://mvnrepository.com/a ...
- node.js中使用yargs来处理命令行参数
yargs库能够方便的处理命令行参数. 一.安装 yargs npm install yargs --save 二.读取命令行参数 const yargs = require('yargs'); le ...