Region手动切分
可以手动去切,也可以自动去切
第一个参数是表名,第二个参数是key, 切分完了之后在r4之前的数据就第一个region去处理,r4之后的数据就第二个region去处理. key是字典排序的 ,比如说 r11和r4比,第一个字符串r是一样大的,比较第二个字符串1比4小,那么r11就在r4前面. 如果是r51的话,是在r4后面,因为第二个值5比4大.
split 't1','r4'
Region自动切分
默认情况下,每次建表的时候只有一个Region,随着数据的不断写入,Region负责的数据量就太多了,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server.这样就可以加快并行处理的效率等等.

1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分(0.94版本之前)。
2.0.94版本之后的切分策略
默认使用IncreasingToUpperBoundRegionSplitPolicy策略切分region, getSizeToCheck()是检查region的大小以判断是否满足切割切割条件。
<!-- region在切分的时候的默认切分策略 --><property><name>hbase.regionserver.region.split.policy</name><value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value><description>A split policy determines when a region should be split. The variousother split policies thatare available currently are ConstantSizeRegionSplitPolicy,DisabledRegionSplitPolicy,DelimitedKeyPrefixRegionSplitPolicy, KeyPrefixRegionSplitPolicy etc.</description></property>
protected long getSizeToCheck(final int tableRegionsCount) {// safety check for 100 to avoid numerical overflow in extreme casesreturn tableRegionsCount == 0 || tableRegionsCount > 100? getDesiredMaxFileSize(): Math.min(getDesiredMaxFileSize(),initialSize * tableRegionsCount * tableRegionsCount * tableRegionsCount);}
tableRegionsCount:为当前Region Server中属于该Table的region的个数。
getDesiredMaxFileSize() 这个值是hbase.hregion.max.filesize参数值,默认为10GB。
initialSize的初始化比较复杂,由多个参数决定。
@Overrideprotected void configureForRegion(HRegion region) {super.configureForRegion(region);Configuration conf = getConf();//默认hbase.increasing.policy.initial.size 没有在配置文件中指定initialSize = conf.getLong("hbase.increasing.policy.initial.size", -1);if (initialSize > 0) {return;}// 获取用户表中自定义的memstoreFlushSize大小,默认也为128MHTableDescriptor desc = region.getTableDesc();if (desc != null) {initialSize = 2 * desc.getMemStoreFlushSize();}// 判断用户指定的memstoreFlushSize是否合法,如果不合法,则为hbase.hregion.memstore.flush.size,默认为128.if (initialSize <= 0) {initialSize = 2 * conf.getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE);}}
总结
具体的切分策略为tableRegionsCount在0和100之间,则为
initialSize(默认为2_128) _ tableRegionsCount^3,例如:
第一次split:1^3 * 256 = 256MB
第二次split:2^3 * 256 = 2048MB
第三次split:3^3 * 256 = 6912MB
第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB
后面每次split的size都是10GB了。
tableRegionsCount超过100个,则超过10GB才会切分region。
