split操作执行的是将HBase中较大的Region分为两个。因为split比较耗时,因此split是在独立的线程中完成的,相关类是CompactSplitThread。
首先,CompactSplitThread中分区的方法主要是以下两个:
CompactSplitThread.requestSplit(HRegion):检测是否需要分区,如果需要分区则调用requestSplit(HRegion, byte[])
CompactSplitThread.requestSplit(HRegion, byte[]):执行分区操作<用户手动分区调用的也是该方法>
CompactSplitThread.requestSplit(HRegion r):
1> CompactSplitThread.shouldSplitRegion():《hbase.regionserver.regionSplitLimit,区域数超过该值则不再进行分区》
2> HRegion.checkSplit():调用的是RegionSplitPolicy.shouldSplit()
分区策略类的配置属性为:
hbase.regionserver.region.split.policy:IncreasingToUpperBoundRegionSplitPolicy<0.94版本之前默认为ConstantSizeRegionSplitPolicy>
IncreasingToUpperBoundRegionSplitPolicy类中shouldSplitRegion()方法首先根据当前分区所属表的分区数计算实际上用于确定是否需要分区的上限大小:
< long sizeToCheck = tableRegionsCount == 0 ? getDesiredMaxFileSize() : Math.min(getDesiredMaxFileSize(), this.flushSize * tableRegionsCount * tableRegionsCount);>
0.94版本之前是存储文件大小的上限是<hbase.hregion.max.filesize=10G:一个区域的某个列族所有HStoreFile总大小,香港服务器,超过则进行分区>,只有达到了该上限才会进行分区。
如果分区中某一个store(列族)的所有存储文件大小大于以上限制,则判断为需要分区。
方法具体内容如下:
1 @Override shouldSplit() { 3if (region.shouldForceSplit()) {; 5 } 6boolean foundABigStore = false;tableRegionsCount = getCountOfCommonTableRegions();sizeToCheck = getSizeToCheck(tableRegionsCount); (Store store : region.getStores().values()) {(!store.canSplit()) {;16 }size = store.getSize();20if (size > sizeToCheck) {21IncreasingToUpperBoundRegionSplitPolicy.LOG.debug(“ShouldSplit because ” + store.getColumnFamilyName() + ” size=” + size + “, sizeToCheck=” + sizeToCheck + “, regionsWithCommonTable=” + tableRegionsCount);22foundABigStore = true;23break;24 }25 }26return foundABigStore;27},网站空间,香港服务器呼唤你前往另一个地方,过上另一种生活。