核心特性region split

简介: 核心特性region split

1.split触发时机与策略


前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后,flush写入磁盘,形成新的HFile文件。


当HFile文件数量不断累积,Region server就会触发compaction机制,把小文件合并为大的HFIle。


当每次flush完成 或者 compaction完成后,regionSplitPolicy就会判断是否需要进行split。


split触发时机简单来说,就是看一个region里面的最大store是否超过阈值。


当然,hbase支持多种策略来设置这个阈值到底怎么计算,这就是触发策略。


  • 0.94版本前默认的策略是ConstantSizeRegionSplitPolicy,这个阈值时一个固定值。


  • 0.94-2.0版本的默认策略是IncreasingToUpperBoundRegionSplitPolicy。


  • 2.0版本的默认策略是SteppingSplitPolicy。这两种策略设置的阈值不是一个固定值,而是会和region所属表在当前regionserver上的region个数有关。只是在计算公式上稍有差异。


另外,还有比如DisableSplitPolicy、KeyPrefixRegionSplitPolicy,DelimitedKeyPrefixRegionSplitPolicy等策略,就不一一介绍了。


2.split流程


一旦开始region split,那么就会创建两个daughter region。


这时候不会立刻将所有数据写到新的region里面去,而是创建引用文件,叫做Reference files,指向parent region。


reference文件作为一个数据规则文件,在split期间,新的查询会根据这个文件去父region的HStore上查询数据。当经过一次major compaction后,数据迁移到新的region中,reference文件会被删除,表示spilit真正完成。


43.jpg


具体过程如下:


1)regionserver在zookeeper中创建一个新的znode在/hbase/region-in-transition/region-name目录下,状态为SPLITTING


2)master通过watch zk上的region-in-transition目录,得知这个region处于split状态


3)region server在HDFS的parent region目录下创建一个子目录叫做“.splits”


4)region server关闭parent region,强制flush这个region下的cache数据,并且标记这个region为下线状态。这个时候,如果有客户端请求落在这个region上,就会抛出NotServingRegionException。


5)Region server创建新的region在.spllits目录下,我们标记为daughter region A和daughter region B,同时创建必要的数据结构。然后就会创建两个Reference文件,指向parent region的那些存储文件。


6)Region Server在HDFS中创建实际的region目录,并将daughterA和daughter B移动到HBase根目录下,形成两个新的region。


7)Region server会发送put请求给.mete. table,然后把parent region设置为offline的状态,并且给新的region添加信息。


8)region server 打开新的region接受读写请求


9)region server将region A和B的信息添加到.meta.表,可以真正对外提供服务了。


扫尾工作:


1)客户端请求.meta.表,发现新的region信息,就会把本地缓存重新设置


2)region server更新zk上/hbase/region-in-transition/region-name目录下的znode状态,改为SPLIT,然后master通过watch得知这个信息。如果有必要,负载均衡器可以选择将新的region分布到新的region server上。


3)完成split工作后,meta和HDFS还是会保留reference文件到parent region。等到下次compaction时,会完成数据到新region的迁移,然后才会删除reference文件。


3.pre-splitting


当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。


主要原因跟split的机制有关,一开始的时候,系统无法判断你到底需要用哪个rowkey进行split。


因此,hbase提供了工具让你能自己解决这个问题,叫做pre-splitting。


你可以在创建表的时候,指定哪些split point将region分成几份。如果切分的好,那么自然就可以一开始就充分利用分布式的特性。但是需要注意,如果切分的不好,存在热点region,那么反而会影响读写性能。


这里也没有一个特别好的原则来说到底pre split多少个region最合适,不过最好的方式,还是以region server数量的倍数(较小的倍数)来创建pre split的region数量,然后让集群本身去做自动的spliting。


4.split的事务性保证


2.0版本后,HBase会使用HLog存储单机事务(DDL\Split\Move等)的中间状态,保证了即使事务过程中出现异常,也能安全地回滚或继续提交。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
缓存 运维 NoSQL
分布式ID生成方法的超详细分析(全)
目录前言1. UUID2. 数据库自增3. 数据库集群4. 数据库号段5. redis模式6. 雪花算法7. 其他总结 前言 关于什么是分布式ID 数据量不是很多的时候,单一个数据库表可以支撑其业务,即使数据在大也可以主从复制 到一定量的数据时,实现分库分表的时候,就需要一个全局唯一的ID,订单的编号就是分布式ID 关于上面牵扯到的主从复制 可看我之前的文章进行查缺补漏 关于主从复制的超详细解析(全) 关于数据库的分布式ID可看我之前在Mycat种提及到 具体都有如下: 在实现分库分表的情况下,数据库自增主
325 0
分布式ID生成方法的超详细分析(全)
|
流计算
在Flink中,Regular Join(包括Left Join)的结果顺序是由Flink的分区策略和数据的分布方式共同决定的
在Flink中,Regular Join(包括Left Join)的结果顺序是由Flink的分区策略和数据的分布方式共同决定的
63 1
|
3月前
|
存储 安全 NoSQL
Go map 读写性能优化 - 分片 map
Go map 读写性能优化 - 分片 map
46 1
|
4月前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
5月前
|
JavaScript 前端开发 测试技术
Map 和 Object 在处理大量数据时性能差异
Map 和 Object 在处理大量数据时性能差异
|
6月前
|
算法 NoSQL 关系型数据库
9种 分布式ID生成方式
9种 分布式ID生成方式
524 0
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
PyTorch并行与分布式(三)DataParallel原理、源码解析、举例实战
791 0
|
JSON 安全 程序员
GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历
这篇文章就是给初学的小伙伴们答疑解惑的,会为大家介绍: 为什么Go语言中的map是无序的,如何自定义实现map的排序?
229 0
GoFrame的gmap相比Go原生的map,天然支持排序和有序遍历
【laralve项目】@21 array_map的使用(重组数据,把id为键->text为值重组数据)
【laralve项目】@21 array_map的使用(重组数据,把id为键->text为值重组数据)
79 0
【laralve项目】@21 array_map的使用(重组数据,把id为键->text为值重组数据)