Region的拆分逻辑是通过CompactSplitThread线程的requestSplit方法来触发的,每当执行MemstoreFlush操作时都会调用该方法进行判断,看是否有必要对目标Region进行拆分。
Region可拆分的前提是需要满足如下约束条件:
目标RegionServer的线上Region数没有达到hbase.regionserver.regionSplitLimit参数阀值
该参数的默认值为1000,达到900时RegionServer将会打印警告:Total number of regions is approaching the upper limit。
StoreFile文件数量没有达到hbase.hstore.blockingStoreFiles参数阀值
此时会优先触发整理操作(详细参考Region整理章节)
要拆分的Region不属于meta表格
HBase不支持对meta表格中的Region做拆分操作。
Region没有处于recovering状态(参考Region恢复章节)
由具体的拆分策略来做决定,通过其shouldSplit方法
HBase对外提供了5中拆分策略,全部由RegionSplitPolicy派生而来,5中策略分别为:
ConstantSizeRegionSplitPolicy
当Region中某个Store数据量达到hbase.hregion.max.filesize参数阀值时进行拆分
IncreasingToUpperBoundRegionSplitPolicy
当Region中某个Store数据量达到sizeToCheck阀值时进行拆分,sizeToCheck是通过如下方法计算得出的,如果RegionServer上含有指定Table的Region数量在(0,100]之间,返回如下公式的值:
min(hbase.hregion.max.filesize, regionCount^3 *