Region手动切分

可以手动去切,也可以自动去切

第一个参数是表名,第二个参数是key, 切分完了之后在r4之前的数据就第一个region去处理,r4之后的数据就第二个region去处理. key是字典排序的 ,比如说 r11和r4比,第一个字符串r是一样大的,比较第二个字符串1比4小,那么r11就在r4前面. 如果是r51的话,是在r4后面,因为第二个值5比4大.

  1. split 't1','r4'

Region自动切分

  1. 默认情况下,每次建表的时候只有一个Region,随着数据的不断写入,Region负责的数据量就太多了,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server.这样就可以加快并行处理的效率等等.

HBase的Region Split - 图1

1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分(0.94版本之前)。

2.0.94版本之后的切分策略

默认使用IncreasingToUpperBoundRegionSplitPolicy策略切分region, getSizeToCheck()是检查region的大小以判断是否满足切割切割条件。

  1. <!-- region在切分的时候的默认切分策略 -->
  2. <property>
  3. <name>hbase.regionserver.region.split.policy</name>
  4. <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy
  5. </value>
  6. <description>
  7. A split policy determines when a region should be split. The various
  8. other split policies that
  9. are available currently are ConstantSizeRegionSplitPolicy,
  10. DisabledRegionSplitPolicy,
  11. DelimitedKeyPrefixRegionSplitPolicy, KeyPrefixRegionSplitPolicy etc.
  12. </description>
  13. </property>
  1. protected long getSizeToCheck(final int tableRegionsCount) {
  2. // safety check for 100 to avoid numerical overflow in extreme cases
  3. return tableRegionsCount == 0 || tableRegionsCount > 100
  4. ? getDesiredMaxFileSize()
  5. : Math.min(getDesiredMaxFileSize(),
  6. initialSize * tableRegionsCount * tableRegionsCount * tableRegionsCount);
  7. }

tableRegionsCount:为当前Region Server中属于该Table的region的个数。

getDesiredMaxFileSize() 这个值是hbase.hregion.max.filesize参数值,默认为10GB。

initialSize的初始化比较复杂,由多个参数决定。

  1. @Override
  2. protected void configureForRegion(HRegion region) {
  3. super.configureForRegion(region);
  4. Configuration conf = getConf();
  5. //默认hbase.increasing.policy.initial.size 没有在配置文件中指定
  6. initialSize = conf.getLong("hbase.increasing.policy.initial.size", -1);
  7. if (initialSize > 0) {
  8. return;
  9. }
  10. // 获取用户表中自定义的memstoreFlushSize大小,默认也为128M
  11. HTableDescriptor desc = region.getTableDesc();
  12. if (desc != null) {
  13. initialSize = 2 * desc.getMemStoreFlushSize();
  14. }
  15. // 判断用户指定的memstoreFlushSize是否合法,如果不合法,则为hbase.hregion.memstore.flush.size,默认为128.
  16. if (initialSize <= 0) {
  17. initialSize = 2 * conf.getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,
  18. HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE);
  19. }
  20. }

总结

具体的切分策略为tableRegionsCount在0和100之间,则为

  1. 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。