hbase 0.94.0版本中,对于region的split方式引入了一个非常方便的SplitPolicy,通过这个SplitPolicy,可以主动的干预控制region split的方式。在org.apache.Hadoop.hbase.regionserver包中,可以找到这么几个自带的splitPolicy: ConstantSizeRegionSplitPolicy, IncreasingToUpperBoundRegionSplitPolicy, and KeyPrefixRegionSplitPolicy。
网站的建设成都创新互联公司专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为成都加固等企业提供专业服务。从名字上就可以分辨出这三种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。
附上代码,在创建或修改table时,指定splicpolicy
[java] view plain
// 更新现有表的split策略
HBaseAdmin admin = new HBaseAdmin( conf);
HTable hTable = new HTable( conf, ”test” );
HTableDescriptor htd = hTable.getTableDescriptor();
HTableDescriptor newHtd = new HTableDescriptor(htd);
newHtd.setValue(HTableDescriptor. SPLIT_POLICY, KeyPrefixRegionSplitPolicy.class .getName());// 指定策略
newHtd.setValue(“prefix_split_key_policy.prefix_length”, ”2″);
newHtd.setValue(“MEMSTORE_FLUSHSIZE”, ”5242880″); // 5M
admin.disableTable( ”test”);
admin.modifyTable(Bytes. toBytes(“test”), newHtd);
admin.enableTable( ”test”);
目前使用的HBASE1.0.1.1使用的REGION SPLIT策略是IncreasingToUpperBoundRegionSplitPolicy。
验证方式如下:通过HBASE前端查看系统中的TDC_TWEETS_201604表,发现该表被拆分成18个REGION,截图如下:
通过HADOOP命令查看每个REGION大小,发现大的7.4G,最小的88M,符合REGION拆分逻辑,截图如下:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。