美文网首页探索人工智能
技术02期:如何设计rowkey使hbase更快更好用【大数据】

技术02期:如何设计rowkey使hbase更快更好用【大数据】

作者: 是极客小普呀 | 来源:发表于2020-07-13 14:02 被阅读0次

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

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

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

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

HBase基本概念

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

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

- 完 -

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

欢迎关注公众号:普适极客

相关文章

  • 技术02期:如何设计rowkey使hbase更快更好用【大数据】

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

  • Hbase 入门

    Hbase简介 参考:Hbase技术详细学习笔记 如何合理的设计HBase RowKey? Hbase是分布式、面...

  • Hbase创建前缀布隆过滤器

    HBASE如何提升根据rowkey前缀扫描? 如果rowkey设计为: rowkey= #

  • HBase-interview-questions

    一 HBase存储结构 HBase结构图示 二 rowkey设计原则 1️⃣ rowkey长度原则 : 建议越短越...

  • Hbase中的存储概念

    数据行设计 Rowkey1. Rowkey :行键,这个概念是整个Hbase的核心,类似于MySQL主键的概念My...

  • Hbase如何设计Rowkey

    分析【话单数据分析】项目需求 用户需要进行实时的查询,那么这些数据是放在HBase当中的,每个客户每天接打电话至少...

  • Spark + Hbase 自定义读取分片数据、深挖内部原理

    大猪 见很多文章都写了Hbase如何设计rowkey避免热点问题,就连 大猪 的文章也写过这样的优化,但是只说到了...

  • Hbase rowkey设计

    hbase的rowkey设计决定了数据的分区和查询的方式,是使用hbase前一定要想清楚的,以下简单列举了设计hb...

  • hbase:rowkey的设计

    hbase的rowkey设计决定了数据的分区和查询的方式,是使用hbase前一定要想清楚的,以下简单列举了设计hb...

  • Hbase 面试题一

    Hbase 中如何统计一张表的行数最快? 方案一:分布式计算程序,读取 Hbase 数据,统计 rowkey 的个...

网友评论

    本文标题:技术02期:如何设计rowkey使hbase更快更好用【大数据】

    本文链接:https://www.haomeiwen.com/subject/qqpacktx.html