在使用hbase做表的时候,表设计也是一个非常重要的概念,一个好的表设计可以为后期hbase的使用减少很多的麻烦。但是对于大多数企业来说,前期在设计表的时候,一般都是做简单的设计,随着后面业务的发展,此时整体表结构可能会涉及到改动,那么此时我们创建的新表会涉及到大量数据的转移,并且还可能涉及到改写一些公共的写入读取相关的model结构,这时的工作量是比较大的,所以一个好的表设计是一个比较良好的开端。这里我们会把表设计逐步拆分出来进行讲解,本文主要介绍的就是行键的设计。
对于hbase的行键,我们知道他是一个根据ASCII码进行排序的字符串,在早期,我们从网上的教程里面了解到设计行键的初衷:
1、行键里面尽量包含特定含义的内容,保证查询数据的时候可以快速定位到。
那么我们在设计的时候,有时候会设计成这样的一些信息,例如:有一个学生的属性,那么我们可能会设计为:
${user_id}_${SCHOOL_ID}_${CLASSid}
以上仅是列举一个案例,这样子在行键里面包含有用户的id,学校的id,班级的id,可以让我们很方便的进行定位。在一些简单的使用或者demo阶段其实这样子是没有任何问题的。但是在高阶的用法里面,这里我们一般会涉及到使用外部索引的方式来解决,并且写入的时候进行分散。这是什么意思呢?
像上面这种定义,对于查询来说我们确实可以快速的定位学生或者班级等信息,但是对于写入来说就不是很良好了,例如我们下面给一组数据:
1_1_1 2_1_1 3_1_1 。。。。
可以看到这里学生id是连续的,学校和班级是相同的。此时我们如果在写入数据的时候就会造成region热点,影响整体的写入效率。所以我们在高阶的用法里面咱们是怎么弄的呢?就是依赖搜索引擎+hash的方式。具体做法如下:
我们首先把数据写入到搜索引擎:
user_id school_id class_id row_key 1 1 1 4eb90ba61276b0e27cee6f190e612949 2 1 1 a6471b147e51f4d317e48cc16ab908ed 3 1 1 133ffeb860736cb2cda845fe8f91af5e
此时我们是把对应的字段进行拆分,然后组合${user_id}_${SCHOOL_ID}_${CLASSid}字符串再进行hash,把hash的值作为hbase的行键存储起来,接着我们再把数据存储到habse中,用上面的hash作为行键。
此时我们会发现所有的行键被进行hash分散了,那么在写入数据的时候会分散到不同的region里面去,此时大大的提高了hbase的写入效率。同时读取的时候也比较方便,首先从搜索引擎里面查询出来对应条件的row_key,然后直接去hbase里面进行get信息即可,效率比之间从行键上检索相关的信息来的更快。
以上就是hbase表设计里面的行键设计的高阶用法。
备注:
1、hbase表设计主要是行键这块比较重要,所以着重介绍rowkey的设计。 2、剩下的列族这块,我们建议不要使用多个列族,一张表99%情况下1个列族就能满足需求,剩余特殊情况下做2个列族,如果超过2个列族,我们建议拆分为2个表。 3、列这块的设计,主要是介绍后面的压缩。详情可查看后面的文章。
还没有评论,来说两句吧...