技术12期:如何设计rowkey使hbase更快更好用【大数据-全解析】

HBase是一个分布式的、面向列的开源数据库存储系统,具有高可靠性高性能可伸缩性,它可以处理分布在数千台通用服务器上的PB级的海量数据。

BigTable的底层是通过GFS来存储数据,而HBase对应的则是通过HDFS(Hadoop分布式文件系统)来存储数据的。

HBase不同于一般的关系型数据库,它是一个适合于非结构化数据存储的数据库。HBase不限制存储的数据的种类,允许动态的、灵活的数据模型。

HBase可以在一个服务器集群上运行,并且能够根据业务进行横向扩展。 

 

HBase基本概念

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

扫描二维码关注公众号,回复: 11571066 查看本文章

Region:Region相当于一个数据的分片。每一个Region都有起始rowkey和结束rowkey,这表示了Region存储的row范围。

一个RegionServer包含多个Region,一个表的一段键值在一个RegionServer上会产生一个Region。在一个RegionServer中有一个或多个Region。

RowKey在Region中的作用:在 HBase 中,Region 相当于一个数据的分片,每个 Region 都有StartRowKey和StopRowKey,这是表示 Region 存储的 RowKey 的范围,HBase 表的数据是按照 RowKey 来分散到不同的 Region,要想将数据记录均衡的分散到不同的Region中去,因此需要 RowKey 满足这种散列的特点。

此外,在数据读写过程中也是与RowKey 密切相关,RowKey在读写过程中的作用:读写数据时通过 RowKey 找到对应的 Region;MemStore 中的数据是按照 RowKey 的字典序排序;HFile 中的数据是按照 RowKey 的字典序排序。

hbase中数据rowkey在region中表现形式如下图:

 

RowKey设计

在HBase中RowKey在数据检索和数据存储方面都有重要的作用,一个好的RowKey设计会影响到数据在HBase中的分布,还会影响我们查询效率,所以一个好的RowKey的设计方案是非常重要的。 

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中。

- 完 -

想了解更多关于人工智能的资讯

欢迎关注普适极客

猜你喜欢

转载自blog.csdn.net/PUSHIAI/article/details/107315655