数据分片的目的在于把一个任务分散到不同的机器上运行,既可以解决单机计算能力上限的问题,也能降低部分任务失败对整体系统的影响。elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器(其实是Job实例,部署在一台机器上的多个Job实例也能分片),开发者需要自行处理分片项与真实数据的对应关系。框架也预置了一些分片策略:平均分配算法策略,作业名哈希值奇偶数算法策略,轮转分片策略。同时也提供了自定义分片策略的接口。

分片原理

elastic-job的分片是通过zookeeper来实现的。分片的分片由主节点分配,如下三种情况都会触发主节点上的分片算法执行:

  • 新的Job实例加入集群
  • 现有的Job实例下线(如果下线的是leader节点,那么先选举然后触发分片算法的执行)
  • 主节点选举

上述三种情况,会让zookeeper上leader节点的sharding节点上多出来一个necessary的临时节点,主节点每次执行Job前,都会去看一下这个节点,如果有则执行分片算法。

分片的执行结果会存储在zookeeper上,如下图,5个分片,每个分片应该由哪个Job实例来运行都已经分配好。分配的过程就是上面触发分片算法之后的操作。分配完成之后,各个Job实例就会在下次执行的时候使用上这个分配结果。

每个job实例任务触发前都会获取本任务在本实例上的分片情况(直接和上图zookeeper上instance节点比对某一个分片是否该有这个Job实例执行),然后封装成shardingContext,传递给调用任务的实际执行方法:

/*** 执行作业.** @param shardingContext 分片上下文*/
void execute(ShardingContext shardingContext);

分片算法

所有的分片策略都继承JobShardingStrategy接口。根据当前注册到ZK的实例列表和在客户端配置的分片数量来进行数据分片。最终将每个Job实例应该获得的分片数字返回出去。 方法签名如下:

/*** 作业分片.* * @param jobInstances 所有参与分片的单元列表* @param jobName 作业名称* @param shardingTotalCount 分片总数* @return 分片结果*/Map<JobInstance, List<Integer>> sharding(List<JobInstance> jobInstances, String jobName, int shardingTotalCount);

分片函数的触发,只会在leader选举的时候触发,也就是说只会在刚启动和leader节点离开的时候触发,并且是在leader节点上触发,而其他节点不会触发。

1. 基于平均分配算法的分片策略

基于平均分配算法的分片策略对应的类是:AverageAllocationJobShardingStrategy。它是默认的分片策略。它的分片效果如下:

  • 如果有3个Job实例, 分成9片, 则每个Job实例分到的分片是: 1=[0,1,2], 2=[3,4,5], 3=[6,7,8].
  • 如果有3个Job实例, 分成8片, 则每个Job实例分到的分片是: 1=[0,1,6], 2=[2,3,7], 3=[4,5].
  • 如果有3个Job实例, 分成10片, 则个Job实例分到的分片是: 1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8].

2. 作业名的哈希值奇偶数决定IP升降序算法的分片策略

这个策略的对应的类是:OdevitySortByNameJobShardingStrategy,它内部其实也是使用AverageAllocationJobShardingStrategy实现,只是在传入的节点实例顺序不一样,也就是上面接口参数的List<JobInstance>。AverageAllocationJobShardingStrategy的缺点是一旦分片数小于Job实例数,作业将永远分配至IP地址靠前的Job实例上,导致IP地址靠后的Job实例空闲。而OdevitySortByNameJobShardingStrategy则可以根据作业名称重新分配Job实例负载。如:

  • 如果有3个Job实例,分成2片,作业名称的哈希值为奇数,则每个Job实例分到的分片是:1=[0], 2=[1], 3=[]
  • 如果有3个Job实例,分成2片,作业名称的哈希值为偶数,则每个Job实例分到的分片是:3=[0], 2=[1], 1=[]

实现比较简单:

long jobNameHash = jobName.hashCode();
if (0 == jobNameHash % 2) {Collections.reverse(jobInstances);
}
return averageAllocationJobShardingStrategy.sharding(jobInstances, jobName, shardingTotalCount);

3. 根据作业名的哈希值对Job实例列表进行轮转的分片策略

这个策略的对应的类是:RotateServerByNameJobShardingStrategy,和上面介绍的策略一样,内部同样是用AverageAllocationJobShardingStrategy实现,也是在传入的List<JobInstance>列表顺序上做文章。

4. 自定义分片策略

除了可以使用上述分片策略之外,elastic-job还允许自定义分片策略。我们可以自己实现JobShardingStrategy接口,并且配置到分片方法上去,整个过程比较简单,下面仅仅列出通过配置spring来切换自定义的分片算法的例子:

<job:simple id="MyShardingJob1" class="nick.test.elasticjob.MyShardingJob1" registry-center-ref="regCenter" cron="0/10 * * * * ?" sharding-total-count="5" sharding-item-parameters="0=A,1=B,2=C,3=D,4=E" job-sharding-strategy-class="nick.test.elasticjob.MyJobShardingStrategy"/>

转载于:https://www.cnblogs.com/haoxinyue/p/6919375.html

elastic-job详解(一):数据分片相关推荐

  1. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  2. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  3. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  4. mysql 数据分组_详解MySQL 数据分组

    创建分组 分组是在select语句中的group by 子句中建立的. 例: select vend_id, count(*) as num_prods from products group by ...

  5. 学习笔记之-Kubernetes(K8S)介绍,集群环境搭建,Pod详解,Pod控制器详解,Service详解,数据存储,安全认证,DashBoard

    笔记来源于观看黑马程序员Kubernetes(K8S)教程 第一章 kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署 ...

  6. 一篇文章详解大数据技术和应用场景

    " 本文作者 陈睿 ,优知学院创始人 新技术.新趋势往往趋之若鹜却又很难说的透彻,希望这篇文章能让大家完整的理解什么是大数据:该篇包含:大数据.技术.场景应用以及大数据的岗位. 什么是大数据 ...

  7. mysql数据存储过程详解_mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  8. pandas详解文本数据

    文本数据 一.string类型的性质 1. string与object的区别 (1)字符存取方法会返回相应数据的Nullable类型,而object会岁缺失值的存在而改变返回类型 (2) 某些Seri ...

  9. dd命令参数详解及数据操作实战

    dd指令使用  语法格式 dd   [option]  dd指令选项详解 if=file:输入文件名,缺省为标准输入 of=file:输出文件名,缺省为标准输出 ibs=bytes:一次读入 byte ...

  10. 01 Redis安装、配置详解、数据备份与恢复

    缓存简介 简介 缓存是为了调节速度不一致的两个或者多个不同的物质的速度,在中间对速度访问较快的一方起到一个加速访问速度较慢的一方的作用,比如cpu的一级,二级缓存是为了保存cpu最近经常访问的数据,内 ...

最新文章

  1. CentOS 7安装教程
  2. iOS Xcode4.2代码管理工具的使用
  3. Mysql Incorrect DATETIME value: ‘01/01/2021 00:00:00‘
  4. Android 音频 OpenSL ES 录音 采集
  5. 算法导论9:栈的链表实现 2016.1.9
  6. 2009开源SNS软件总结
  7. Python MySQL操作
  8. 今天下午又是在教室里坐了一个下午,头有点晕
  9. 【Unicode编码表】UniCode编码表+转化器
  10. Login 和 Logout
  11. 文件操作之特殊文件操作
  12. 微知识|人工智能 第一期
  13. 后台管理项目开发流程
  14. 顶级投资机构ARK将区块链列为颠覆式创新技术
  15. 最近在写一款斗地主游戏,写了个癞子匹配顺子的算法
  16. 电影《大长今》励志启示
  17. Linux下退出vi编辑模式
  18. C语言-思路与编程1
  19. RK3399外设驱动之RTC驱动(二):hym8563驱动
  20. 三、mysqld程序的运行原理及数据库结构

热门文章

  1. 前端代码标准最佳实践:HTML篇
  2. 一起谈.NET技术,浅析购物车的实现
  3. Windows Live Messenger Beta的邀请
  4. OK6410裸机开发之LED灯
  5. Clojure 入门
  6. C++中实现回调机制的几种方式
  7. C语言入门书籍--C语言程序设计
  8. <X86汇编语言:实模式到保护模式>四十四 协同式任务切换
  9. spring18-3: 工厂bean代理-半自动
  10. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数