hbase建表分区的问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

展开
收起
hbase小能手 2018-11-08 10:49:26 2662 0
2 条回答
写回答
取消 提交回答
  • 专注在大数据分布式计算、数据库及存储领域,拥有13+年大数据引擎、数据仓库、宽表引擎、平台研发经验,6年云智能大数据产品技术一号位经验,10年技术团队管理经验;云智能技术架构/云布道师; 研发阿里历代的大数据技术产品包括ODPS、DLA、ADB,最近五年主导宽表引擎研发、DLA、ADB湖仓研发;

    最好的分区原则:

    初次接触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

    2019-07-17 23:12:53
    赞同 展开评论 打赏
  • HBase是一个分布式的、面向列的开源数据库,一个结构化数据的分布式存储系统。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。阿里云HBase技术团队共同探讨HBase及其生态的问题。

    经过社区同学的帮助,这个问题已经解决;
    (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_jpeg
    当region数大于3的时候,调用split(startKey, endKey, numRegions - 3)方法获得splitKeys,如下图所示,此时的split是在sartKey和endKey进行均衡分区 ,根据split获取splitKeys,然后根据splitKeys进行分区
    2_jpeg

    2019-07-17 23:12:53
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新
相关电子书
更多
HBase 3.0
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载