public void createTable(HTableDescriptor desc, byte [] startKey,
byte [] endKey, int numRegions)
throws IOException {
if(numRegions < 3) {
throw new IllegalArgumentException("Must create at least three regions");
} else if(Bytes.compareTo(startKey, endKey) >= 0) {
throw new IllegalArgumentException("Start key must be smaller than end key");
}
if (numRegions == 3) {
createTable(desc, new byte[][]{startKey, endKey});
return;
}
byte [][] splitKeys = Bytes.split(startKey, endKey, numRegions - 3);
if(splitKeys == null || splitKeys.length != numRegions - 1) {
throw new IllegalArgumentException("Unable to split key range into enough regions");
}
createTable(desc, splitKeys);
}
在hbase里用createTable方法建表分区,为什么这里的numRegions(分区数)不能小于3
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
最好的分区原则:
初次接触HBase的客户,在创建HBase表的时候,不指分区的数目,另外就是rowkey设计不合理,导致热点。
最为常见的建表语句为:
create ‘t3’,’f1’, { NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’ , COMPRESSION => ‘snappy’}
其中 NUMREGIONS 为 region的个数,一般取10-500左右,集群规模大,可以取大一些,
SPLITALGO 为 rowkey分割的算法:Hbase自带了两种pre-split的算法,分别是 HexStringSplit 和 UniformSplit,HexStringSplit 如果我们的row key是十六进制的字符串作为前缀的,就比较适合用HexStringSplit,关于rowkey的设计可以参考:RowKey设计
COMPRESSION压缩算法,参考:数据压缩与编码
文档地址:https://help.aliyun.com/document_detail/71787.html?spm=a2c4g.11186623.6.572.3a0278f0ORQunR
经过社区同学的帮助,这个问题已经解决;
(1)在建表时,若不进行预分区,则默认的splitKeys为null,即只有一个分区。此时的startKey和endKey都为null,只有region大小达到阈值是才会进行split(除手动分区),入下图所示
(2)在建表时,若进行预分区,则此时的分区数目至少为3,并且startKey和endKey不能相同,否则会报:IllegalArgumentException("Start key must be smaller than end key");这个异常。
当region数为3的时候,调用createTable(desc, new byte{startKey, endKey});,此时的startKey,和endKey即为分区的splitKeys,按照下图的方法进行分区
当region数大于3的时候,调用split(startKey, endKey, numRegions - 3)方法获得splitKeys,如下图所示,此时的split是在sartKey和endKey进行均衡分区 ,根据split获取splitKeys,然后根据splitKeys进行分区