HBase Region分裂的三种策略

1、ConstantSizeRegionSplitPolicy

一个Region中最大Store的大小超过阈值之后就会触发分裂。该策略最简单,但弊端相当大。阈值设置大,对大表友好,小表可能不会触发分裂,极端情况下可能只有一个region。阈值设置小,对小表友好,但一个大表可能在集群中产生大量的region。对于集群管理不是好事。

2、IncreasiongToUpperBoundRegionSplitPolicy

一个Region中最大Store的大小超过阈值之后就会触发分裂。阈值不是固定的值,而是在一定情况下不断调整的,调整后的阈值大小和Region所属表在当前region server上的region个数有关系。
调整后的阈值 = regions regions flushsize * 2
阈值不会无限增大,maxRegionFileSize来做限制。能够自适应大小表,集群规模大的情况下,对大表很优秀,对小表会产生大量小region

3、SteppingSplitPolicy
分裂阈值大小和待分裂Region所属表在当前Region Server上的region个数有关系。
如果region个数为1,分裂之为flushsize * 2。
否则为 maxRegionFileSize
大表小表都不会产生大量的region

Region分裂准备

1、初始化两个子Region对象
2、更改zk的状态为splitting、更改master内存中父region的状态信息
3、在父目录下新建.split文件夹
4、关闭父region,flush操作,数据落盘。短时间落在父region上的请求都会抛异常
5、在.split文件夹下生成两个子文件夹daughterA、daughterB,并在两个文件夹内生成reference文件,分别指向父region中对应的文件

reference是引用文件,文件中的内容并不是用户数据。由两部分构成,分裂点、boolean变量,true表示reference引用的是父文件的上部分,false表示下半部分

6、分裂成两个region后,将daughterA、daughterB拷贝到HBase根目录
7、下线父region,修改meta表,

根据reference文件查找数据

1、根据文件名定位到具体文件(父region名+hfile名)
2、根据reference文件内容的两个变量确定要扫描的部分数据

父region数据迁移到子region

Major Compaction

父region被删除的时间

master启动线程定期遍历检查所有处于splitting状态的父region
1、读取出meta表中所有split为true的region,加载出他们的子region
2、检查子region是否还存在引用文件,若不存在,父region对应的文件就能删除

你可能感兴趣的:(hbase)