一个Region中最大Store的大小超过阈值以后就会触发分裂。该策略最简单,但弊端至关大。阈值设置大,对大表友好,小表可能不会触发分裂,极端状况下可能只有一个region。阈值设置小,对小表友好,但一个大表可能在集群中产生大量的region。对于集群管理不是好事。线程
一个Region中最大Store的大小超过阈值以后就会触发分裂。阈值不是固定的值,而是在必定状况下不断调整的,调整后的阈值大小和Region所属表在当前region server上的region个数有关系。
调整后的阈值 = regions regions flushsize * 2
阈值不会无限增大,maxRegionFileSize来作限制。可以自适应大小表,集群规模大的状况下,对大表很优秀,对小表会产生大量小regioncode
三、SteppingSplitPolicy
分裂阈值大小和待分裂Region所属表在当前Region Server上的region个数有关系。
若是region个数为1,分裂之为flushsize * 2。
不然为 maxRegionFileSize
大表小表都不会产生大量的regionserver
一、初始化两个子Region对象
二、更改zk的状态为splitting、更改master内存中父region的状态信息
三、在父目录下新建.split文件夹
四、关闭父region,flush操做,数据落盘。短期落在父region上的请求都会抛异常
五、在.split文件夹下生成两个子文件夹daughterA、daughterB,并在两个文件夹内生成reference文件,分别指向父region中对应的文件对象
reference是引用文件,文件中的内容并非用户数据。由两部分构成,分裂点、boolean变量,true表示reference引用的是父文件的上部分,false表示下半部分
六、分裂成两个region后,将daughterA、daughterB拷贝到HBase根目录
七、下线父region,修改meta表,内存
一、根据文件名定位到具体文件(父region名+hfile名)
二、根据reference文件内容的两个变量肯定要扫描的部分数据it
Major Compactionio
master启动线程按期遍历检查全部处于splitting状态的父region
一、读取出meta表中全部split为true的region,加载出他们的子region
二、检查子region是否还存在引用文件,若不存在,父region对应的文件就能删除ast