hbase 0.94.0版本中,对于region的split方式引入了一个非常方便的SplitPolicy,通过这个SplitPolicy,可以主动的干预控制region split的方式。在org.apache.Hadoop.hbase.regionserver包中,可以找到这么几个自带的splitPolicy: ConstantSizeRegionSplitPolicyIncreasingToUpperBoundRegionSplitPolicy, and KeyPrefixRegionSplitPolicy

从名字上就可以分辨出这三种split策略的适用场景:

ConstantSizeRegionSplitPolicy按固定长度分割region,固定长度取值优先获取table的”MAX_FILESIZE” 值,若没有设定该属性,则采用在hbase-site.xml中配置的hbase.hregion.max.filesize值,在0.94版本中这个值的缺省值已经被调整为:10 * 1024 * 1024 * 1024L 也就是10G,网上很多关于 hbase.hregion.max.filesize 默认值 1G的文章应该都是基于0.92的hbase的。这个在使用中需要明确具体的hbase版本号。这个策略是0.94版本之前默认使用的,采用该策略后,当table的某一region中的某一store大小超过了预定的最大固定长度时,对该region进行split。splitPoint算法的选择还是依据“数据对半”原则,找到该region的最大store的中间长度的rowkey进行split。

 

IncreasingToUpperBoundRegionSplitPolicy:按照region数量累增划分region,该策略为Hbase 0.94默认使用的策略,采用该策略分割的region大小是不相等的,每次新region的大小随着region数量的增多而增大。具体增长方法为:Min (R^2 *  ”MEMSTORE_FLUSHSIZE”||”hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”);其中R 为当前这个region所在regionserver中对应此table的region数,MEMSTORE_FLUSHSIZE 为table创建时指定大小,若table指定了此属性则忽略下面的hbase.hregion.memstore.flush.size 。

hbase.hregion.memstore.flush.size 为hbase-site中设定大小 默认128M

hbase.hregion.max.filesize 为hbase-site中设定的单个region大小,默认10G

每次region大小是取上述两个size中较小的那个。

假设使用hbase.hregion.memstore.flush.size 128M, hregion.max.filesize为10G, 那么每次region增长情况为:512M,1152M,2G,3,2G,4,6G,6,2G,etc。当region增长到9个时,9*9*128M/1024=10.125G >10G,至此以后region split大小都固定为10G。

 

KeyPrefixRegionSplitPolicy:指定rowkey前缀位数划分region,通过读取table的prefix_split_key_policy.prefix_length属性,该属性为数字类型,表示前缀长度,

在进行split时,按此长度对splitPoint进行截取。个人理解是rowkey前缀不相等,则划分region。此种策略比较适合固定前缀的rowkey。当table中没有设置prefix_split_key_policy.prefix_length属性,或prefix_split_key_policy.prefix_length属性不为Integer类型时,指定此策略效果等同与使用IncreasingToUpperBoundRegionSplitPolicy

 splitpolicy类继承关系

附上代码,在创建或修改table时,指定splicpolicy

[java] view plain copy

  1. // 更新现有表的split策略  

  2.          HBaseAdmin admin = new HBaseAdmin( conf);  

  3.          HTable hTable = new HTable( conf, ”test” );  

  4.          HTableDescriptor htd = hTable.getTableDescriptor();  

  5.          HTableDescriptor newHtd = new HTableDescriptor(htd);  

  6.           newHtd.setValue(HTableDescriptor. SPLIT_POLICY, KeyPrefixRegionSplitPolicy.class .getName());// 指定策略  

  7.           newHtd.setValue(“prefix_split_key_policy.prefix_length”, ”2″);  

  8.           newHtd.setValue(“MEMSTORE_FLUSHSIZE”, ”5242880″); // 5M  

  9.          admin.disableTable( ”test”);  

  10.          admin.modifyTable(Bytes. toBytes(“test”), newHtd);  

  11.          admin.enableTable( ”test”);  



目前使用的HBASE1.0.1.1使用的REGION SPLIT策略是IncreasingToUpperBoundRegionSplitPolicy

验证方式如下:通过HBASE前端查看系统中的TDC_TWEETS_201604表,发现该表被拆分成18个REGION,截图如下:

wKiom1cwCljgiZ0fAAFeNUbwOi4266.png


通过HADOOP命令查看每个REGION大小,发现最大的7.4G,最小的88M,符合REGION拆分逻辑,截图如下:

wKiom1cwC1XR11ZhAABA8MwWUUQ757.png