Code前端首页关于Code前端联系我们

HBase核心知识点超全解析

terry 2年前 (2023-09-26) 阅读数 49 #数据库

HBase的好坏很大程度上取决于其主要关键点的设计好坏,所以学习HBase的核心知识点是非常有必要的。今天我们将从概念、功能和设计原理来探索RowKey的世界。

RowKey是什么?

HBase 是一个 nosql(不仅仅是 sql)数据库。既然是数据库,增删改查(curd)就是它最重要的操作。在增、删、改、查过程中,RowKey充当主键。与许多nosql数据库一样,它可以唯一标识一行记录。

RowKey 行键(RowKey)可以是任何字符串。在HBase内部,原理是以字节数组的形式存储的。保存时,数据按照RowKey的字典顺序(字节顺序)存储。设计系统时,充分利用排序存储功能和经常一起读取的行的存储。

RowKey的特点:

RowKey类似于主键,可以唯一标识一行记录;由于数据是按照RowKey的字典顺序(字节顺序)存储的,因此HBase中的数据始终是有序的。 RowKey 可以由用户指定,只要字符串不重复即可。用法:

get:通过指定单个RowKey获取单个匹配记录; as:根据RowKey的影响力进行匹配; scan:通过设置startRow和stopRow参数进行范围比较(注:如果不设置,则会扫描整个表)。 RowKey的作用

RowKey的作用可以概括为:

Hbase在读写数据时需要通过RowKey找到对应的区域; MemStore和HFile中的数据按照RowKey的字典顺序排序。在HBase中,一个Region相当于一个数据片段。每个区域都有一个开始和结束(用来表示该区域存储的区域范围)。 HBase表中的数据按地域存储在不同的地域。在该区域。

RowKey的主要任务是将数据记录均匀分布到不同地区,避免出现热点。

什么是热点现象?

实际运行中,当大量请求访问一个或多个HBase集群节点时,若干RegionServer读写请求过多,负载过大,而其他RegionServer负载很小,导致热点地方。

感谢RowKey的优化,我们避免了热点

Reversion(反转),顾名思义,就是反转固定长度或数字格式的线路。取消分为一般数据取消和时间戳取消,其中以时间戳取消最为常见。

适用场景:

原本设计的RowKey数据分布不均匀,但是RowKey尾部的数据表现出良好的随机性(注:随机性强意味着变化频繁,没有意义,但分布比较小)OK ),此时你可能会考虑反转 RowKey 的信息或直接将尾随字节移至 RowKey 的开头。逆转可以有效地让RowKey随机分布,但逆转后的有序性肯定无法保证,所以牺牲了RowKey的有序性。

加盐与密码学中的加盐方法不同。 RowKey加盐的原理是在原来的RowKey前面添加一个固定长度的随机数,即给RowKey分配一个随机前缀,使其与之前的RowKey相同。开始就不一样了。

适用场景:

虽然提出的RowKey有意义,但数据相似,随机性比较低。逆转不能保证随机性,因此不能按照RowKey的说法分配到不同的地区。这时候就可以采用加盐的方法了。

需要注意的是,随机数必须能够平衡所有区域之间的数据负载。这意味着分配的随机前缀类型的数量应该与您想要将数据分发到的区域数量一致。只有这样,加盐的行才会根据随机生成的前缀分散到不同的区域,从而避免热点。

Hash 这里的hash是根据RowKey的全部或部分数据进行哈希,然后将哈希值全部或部分替换为原来的RowKey前缀。这里常用的哈希包括 MD5、sha1、sha256 或 sha512 等算法。

适用场景:

其实哈希和加盐的适用场景是类似的,但是由于加盐方法的前缀是随机数,使用原始密钥查询不方便,所以就出现了哈希方法。由于哈希方法是使用各种常见算法计算前缀,因此哈希将负载分散到整个集群上,同时允许轻松读取数据。

RowKey 的设计原则

HBase 提出了四个 RowKey 设计原则:长度原则、唯一性原则、排序原则、哈希原则。

RowKey 长度原则基本上是一个可以是任何字符串的二进制代码流。最大长度为 64 kb。在实际应用中,通常为10-100字节。它存储为byte[]数组,一般设计为固定长度。官方建议是越短越好,不超过16字节。

唯一性原则由于RowKey是用来唯一标识一行记录的,所以设计时必须保证RowKey的唯一性。

需要注意的是,由于HBase中的数据存储格式是键值对格式,因此如果将相同的RowKey数据插入到HBase中的同一张表中,原来存在的数据将会被新数据覆盖(并且HashMap效果是一样的)。

HBase 的排序原理是按照自然 ASCII 顺序对 RowKey 进行排序,所以在设计 RowKey 时,可以根据这个特性设计出完美的 RowKey。正确使用这个函数就是排序的原则。

RowKey根据哈希原理设计的,必须均匀分布到各个RegionServer。例如,在设计RowKey时,当Rowkey增加时间戳时,不要将时间放在二进制代码之前。可以使用Rowkey的高位作为程序循环生成的哈希字段,并且可以像这样将时间字段放在低位。这可以增加数据在每个区域服务器上均匀分布的可能性。实现负载均衡。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门