hbase建表分区的问题

  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
已邀请:

beyond

赞同来自: ProgramGeek Jepson

经过社区同学的帮助,这个问题已经解决;
(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,按照下图的方法进行分区

1.jpg

 
当region数大于3的时候,调用split(startKey, endKey, numRegions - 3)方法获得splitKeys,如下图所示,此时的split是在sartKey和endKey进行均衡分区 ,根据split获取splitKeys,然后根据splitKeys进行分区
2.jpg

 

要回复问题请先登录注册


中国HBase技术社区微信公众号:
hbasegroup

欢迎加入HBase生态+Spark社区钉钉大群