分析&回答

Rowkey(行键)

用来标识表中唯一的一行数据,以字节数组形式存储,类似关系型数据库中表的主键。rowkey在HBase中是严格按照字典序排序的。

RowKey设计原则

唯一原则

必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同Rowkey,则原先的数据会被覆盖掉(如果表的version设置为1的话),所以务必保证Rowkey的唯一性。

例如:如果hbase表是存放以人为单位的数据时,在rowkey应该包含身份证信息,以确保他的唯一性。

排序原则

HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点。

例如:设计客户消费记录表时,可以把客户的id放在rowkey头部,这样通过客户id查询记录时,数据都存在同一个region中,查询效率就会提高。

散列原则

我们设计的Rowkey应均匀的分布在各个HBase节点上。

拿常见的时间戳举例,假如Rowkey是按系统时间戳的方式递增,Rowkey的第一部分如果是时间戳信息的话将造成所有新数据都在一个RegionServer上堆积的热点现象。

也就是通常说的Region热点问题,热点发生在大量的client直接访问集中在个别RegionServer上(访问可能是读,写或者其他操作),导致单个RegionServer机器自身负载过高,引起性能下降甚至Region不可用。

常见的是发生jvm full gc或者显示region too busy异常情况,当然这也会影响同一个RegionServer上的其他Region。

例如:hbase表中放的是人的行为数据时,在rowkey的设计时,就不能把时间戳放到rowkey的前面部分,选择身份证号放在开头是不错的选择。

长度原则

Rowkey是一个二进制,建议是越短越好。

原因:其一是HBase的持久化文件HFile是按照KeyValue存储的,如果Rowkey过长比如500个字节,1000万列数据光Rowkey就要占用500*1000万=50亿个字节,将近1G数据,这会极大影响HFile的存储效率其二是MemStore缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统无法缓存更多的数据,这会降低检索效率。

例如:如果不涉及查询的字段就不要放到rowkey,如果只需要通过身份号查询,那就不用将名字、电话、地址其他信息放到rowkey中。

RowKey字段选择

RowKey字段的选择,遵循的最基本原则是唯一性,RowKey必须能够唯一的识别一行数据。RowKey字段都应该参考最高频的查询场景。

数据库通常都是以如何高效的读取和消费数据为目的,而不是数据存储本身。

结合具体的负载特点,再对选取的RowKey字段值进行改造,组合字段场景下需要重点考虑字段的顺序。

避免数据热点的方法

RowKey字段的设计避免出现数据集中在同一region的情况,尽可能在写入数据时所有region都均匀的插入等量数据。

如果rowkey字段选择无法避免数据热点问题时,可以观察rowkey尾部若呈现良好的随机分布数,可以倒转rowkey来避免热点问题。又或rowkey头部添加固定位数的随机数也可以使数据均匀分布。但是这些方法同时也会让数据分布失去有序性。

反思&扩展

总结:

hbase的数据操作与rowkey息息相关,合适的rowkey设计能使hbase数据库发挥最大的性能。在设计rowkey应遵循四大原则,在字段选择时应选取查询频率最多的那些字段,还应该注意热点问题,避免数据集中分布在某些region中。

喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: