elastic-job详解(一):数据分片

2023-11-06

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

分片原理

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

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

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

image

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

image

 

每个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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elastic-job详解(一):数据分片 的相关文章

  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • python - _mysql 无法打开包含文件:'config-win.h':安装 mysql-python 时没有这样的文件或目录

    我试图安装两个名为 mysql python 和 mysqlclient fork of mysql python 的 python 库 然后当我尝试使用 pip 安装它时出现此错误 Collecting mysql python Usin
  • 使用 Coldfusion 分页

    是否可以仅使用一个查询在 Coldfusion 中分页并显示页数 我的理解是 您显然可以使用一个查询进行分页 但您需要一个额外的查询来创建页面 这是为了计算结果总数 currentPage 1 resultsPerPage Offset i
  • 在 MySQL 5.6 中重置 ROOT 密码

    我一直在关注这些说明 http dev mysql com doc refman 5 6 en resetting permissions html用于重置root本地安装的密码MySQL 5 6在 Windows 7 笔记本电脑上 我停止
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 防止重复数据输入mysql数据库

    我试图让我的电子邮件订阅服务拒绝数据库中已存在的电子邮件 这样用户就不会订阅同一封电子邮件两次 这就是我所拥有的 但它不起作用 有什么想法吗
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • 存储过程函数中的动态表名

    我编写了一个存储过程函数来从表中获取名称 问题是我希望将表名作为参数传入 有几个不同的表我需要使用此函数 DELIMITER CREATE DEFINER root localhost FUNCTION getName tableName
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • IMAP 和 PHP - 从已发送文件夹和收件箱文件夹中获取所有电子邮件

    我正在尝试获取接收和发送的所有电子邮件 并使用 PHP 将其写入 mySQL 数据库 我使用的主机名是 hostname imap gmail com 993 imap ssl INBOX 它仅引用收件箱 并成功抓取收到的电子邮件 为了抓取
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • MySQL解释更新

    作为我大学复习的一部分 我试图回答以下问题 至少在表的一个属性上创建索引 employees 数据库 您可以在其中使用 MySQL EXPLAIN 工具 清楚地显示好处 在条款或检索方面 和负面 在 更新条款 创建相关索引的信息 对于第一部
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • pytorch 神经网络套路 使用Dataset,DataLoader实现多维输入特征的二分类

    1 数据集 传送门 内含刘老师讲课视频PPT及相关数据集 本文所用数据集名为diabetes cvs gz 链接 https pan baidu com s 1vZ27gKp8Pl qICn p2PaSw 提取码 cxe4 其中 x1 x8
  • mysql java连接说明

    jdbc mysql 127 0 0 1 3306 guns autoReconnect true useUnicode true characterEncoding utf8 zeroDateTimeBehavior convertToN
  • CentOS 8 下 Mysql 8 主从从的搭建

    CentOS 8 下 Mysql 8 主从从的搭建 1 环境 root localhost etc cat etc redhat release CentOS Linux release 8 2 2004 Core root localho
  • 学习网络安全踩坑笔记

    文章目录 前言 一 Window踩坑 1 虚拟机安装系统失败 解决办法 2 编写批处理文件 3搭建web服务器出现目录而不是网页 4用户加入域常见问题 5 域环境中添加DHCP服务器授权时 DHCP服务无法访问 Windows Active
  • 高光谱遥感图像处理(14)-----ENVI使用教程之监督分类与非监督分类

    监督分类 又称训练分类法 用被确认类别的样本像元去识别其他未知类别像元的过程 它是在分类之前通过目视判读和野外调查 对遥感图像上某些样区中影像地物的类别属性有了先验知识 对每一种类别选取一定数量的训练样本 计算机计算每种训练样区的统计或其他
  • Maven本地仓库位置设置和实际读取不正确问题

    今天发现自己的项目的maven本地仓库不是默认的位置 默认位置一般是 C Users 用户名 m2 repository 然后我在idea中 尝试变更 本地仓库位置 变更之后 发现读取的位置没有发现变化 不是自己这里设置的位置 后来发现 在
  • 3.1.2 Hive on Spark配置

    3 1 2 Hive on Spark配置 1 兼容性说明 注意 官网下载的Hive3 1 2和Spark3 0 0默认是不兼容的 因为Hive3 1 2支持的Spark版本是2 4 5 所以需要我们重新编译Hive3 1 2版本 编译步骤
  • 李开复:创业开始别想太高 年轻人多看国外网站

    新浪科技讯 10月30日下午消息 据多家台湾媒体报道 创新工场董事长兼首席执行官李开复今天在台湾参加 远见 第12届华人企业领袖远见高峰会 他指出 台湾创业环境没转好 建议台湾创业团队没必要一开始想太高 太大 应先解决用户的小问题 李开复去
  • Java 生成随机数全数字方式

    生成9位随机数字 System out println int Math random 9 1 100000000 生成8位随机数字 System out println int Math random 9 1 10000000 生成6位随
  • Visual Studio 2015/2017/2019 设置透明主题、个性背景(含异常解决方法)

    Visual Studio 2015 2017 2019主题设置 透明主题 个性背景 1 首先打开工具 gt 扩展与更新 分别下载和安装以下两个插件 如果出现下载或安装异常 可点击右上的详细信息单独下载安装 注 如果找不到moeide 可以
  • php7.4 安装xdebug3.1.3扩展

    一 检测需要的xdebug版本 使用网站 Xdebug Support Tailored Installation Instructions 可以参考这篇文章 phpStorm 安装使用xdebug断点调试流程 墨 眉 CSDN博客 得出我
  • C++参数传递

    C 参数传递 目录 C 参数传递 1 基本参数传递方式 按值传递 指针传递 引用传递 总结 2 指针与引用区别 3 参数为指针的指针或指针的引用 1 void func char a 2 void func1 char a 3 void f
  • Apache SSHD服务端:ssh2、sftp 登录验证超时时间、连接断开超时时间

    通过ssh2 sftp协议连接基于Apache MINA SSHD的服务时 长时间不用连接会自动断开 我们来看一下默认断开时间和如何修改断开时间 超时报错日志 Disconnecting ServerSessionImpl username
  • ubuntu 服务管理运行程序 sysv-rc-conf

    sysv rc conf是一个强大的服务管理程序 Ubuntu运行级别Linux 系统任何时候都运行在一个指定的运行级上 不同的运行级的程序和服务都不同 所要完成的工作和要达到的目的不同 系统可以在这些运行级之间进行切换 以完成不同的工作
  • socket包长度问题: send recieve(转载)

    一个包没有固定长度 以太网限制在46 1500字节 1500就是以太网的MTU 超过这个量 TCP会为IP数据报设置偏移量进行分片传输 现在一般可允许应用层设置8k NTFS系 的缓冲区 8k的数据由底层分片 而应用看来只是一次发送 win
  • C语言 标识符、合法常量、转义字符

    一 合法标识符 用户定义的合法标识符需满足以下两个要求 标识符只能由字母 数字和下划线组成 标识符不能以数字开头 二 合法常量 整型常量 十进制 10 八进制 017 以0开头 不能出现8 9 十六进制 0xA1 以0x开头 实型常量 强调
  • Mac安装python

    一 下载python 官网地址 https www python org downloads macos 目前主流版本应该是3 7 3 8 3 9 文章以3 8为例 作者已将下载包放到网盘 方便取用 网盘地址 https pan baidu
  • Ngrok 内网穿透

    一 配置Ngrok 准备内网穿透 1 到ngrok官网去注册一个号 国内也有一个sunny ngrok 但是我用来几次全部失败了 所以推荐国外的 网址是 https ngrok com 2 我注册的时候面临验证码刷不出来 所以建议直接用gi
  • MVB通讯机制

    MVB通信只能是主从式通信 主站配置调度表 轮询各从站 从站应答主站命令 采用广播式发送 MVB网络上其他节点过滤地接收网络上的信息 首发 待学习指导
  • elastic-job详解(一):数据分片

    数据分片的目的在于把一个任务分散到不同的机器上运行 既可以解决单机计算能力上限的问题 也能降低部分任务失败对整体系统的影响 elastic job并不直接提供数据处理的功能 框架只会将分片项分配至各个运行中的作业服务器 其实是Job实例 部