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 various
other split policies that
are 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 cases
return tableRegionsCount == 0 || tableRegionsCount > 100
? getDesiredMaxFileSize()
: Math.min(getDesiredMaxFileSize(),
initialSize * tableRegionsCount * tableRegionsCount * tableRegionsCount);
}
tableRegionsCount:为当前Region Server中属于该Table的region的个数。
getDesiredMaxFileSize() 这个值是hbase.hregion.max.filesize参数值,默认为10GB。
initialSize的初始化比较复杂,由多个参数决定。
@Override
protected 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大小,默认也为128M
HTableDescriptor 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。