HBase核心知识点RowKey超全面解析

2020年5月22日15:46:53 发表评论 451 views

HBase的质量很大程度取决于其主键RowKey的设计质量,所以学习HBase的核心知识点RowKey就非常必要了。今天就让我们一起从概念、功能、设计原则来探索RowKey的世界。

什么是RowKey?

HBase是一个nosql(not only sql)数据库,既然是数据库,增删改查(curd)是对其最主要的操作。而在增删改查的过程中RowKey就充当了主键的作用,它和众多的nosql数据库一样,可以唯一的标识一行记录

RowKey行键 (RowKey)可以是任意字符串,在HBase内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。

RowKey的特点

RowKey类似于主键,可以唯一的标识一行记录;由于数据按照RowKey的字典序(byte order)排序存储,因此HBase中的数据永远都是有序的。RowKey可以由用户自己指定,只要保证这个字符串不重复就可以了。使用方式

get:通过指定单个RowKey来获取对应的唯一一条记录;like:通过RowKey的range来进行匹配;scan:通过设置startRow和stopRow参数来进行范围匹配(注意:如果不设置就是全表扫描)。RowKey的作用

RowKey的作用可以归纳如下两点:

Hbase在读写数据时需要通过RowKey找到对应的Region;MemStore和HFile中的数据都是按照 RowKey 的字典序排序。在HBase中,一个Region就相当于一个数据分片,每个Region都有StartRowKey和StopRowKey(用来表示 Region存储的RowKey的范围),HBase表里面的数据是按照RowKey来分散存储到不同的Region里面的。

而将数据记录均衡的分散到不同的Region中避免热点现象就是RowKey最主要的作用。

什么是热点现象?

在实际操作中,当大量请求访问HBase集群的一个或少数几个节点,造成少数RegionServer的读写请求过多,负载过大,而其他RegionServer负载却很小,这样就造成热点现象。

通过RowKey的优化,避免热点现象

反转(Reversing)顾名思义它就是把固定长度或者数字格式的 rowkey进行反转,反转分为一般数据反转和时间戳反转,其中以时间戳反转较常见。

适用场景

初步设计出的RowKey在数据分布上不均匀,但RowKey尾部的数据却呈现出了良好的随机性(注意:随机性强代表经常改变,没意义,但分布较好),此时,可以考虑将RowKey的信息翻转,或者直接将尾部的bytes提前到RowKey的开头。反转可以有效的使RowKey随机分布,但是反转后有序性肯定就得不到保障了,因此它牺牲了RowKey的有序性。

加盐(Salting)不同于密码学里得加盐方法,RowKey的加盐原理是在原RowKey的前面添加固定长度的随机数,也就是给RowKey分配一个随机前缀使它和之前的RowKey的开头不同。

适用场景:

设计的RowKey虽有意义的,但是数据类似,随机性比较低,反转也没法保证随机性,这样就没法根据RowKey分配到不同的Region里,这时候就可以使用加盐的方式了。

需要注意随机数要能保障数据在所有Regions间的负载均衡,也就是说分配的随机前缀的种类数量应该和你想把数据分散到的那些region的数量一致。只有这样,加盐之后的rowkey才会根据随机生成的前缀分散到各个region中,避免了热点现象。

哈希(Hashing)这里的哈希是基于RowKey的完整或部分数据进行Hash,而后将哈希后的值完整替换或部分替换原RowKey的前缀部分。这里说的hash常用的有MD5、sha1、sha256 或 sha512 等算法。

适用场景:

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

RowKey设计原则

HBase提出了四点RowKey的设计原则:长度原则、唯一原则、排序原则,散列原则。

长度原则RowKey本质上是一个二进制码的流,可以是任意字符串,最大长度为64kb,实际应用中一般为10-100byte,以byte[]数组形式保存,一般设计成定长。官方建议越短越好,不要超过16个字节。

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

需要注意,由于HBase中数据存储的格式是Key-Value对格式,所以如果向HBase中同一张表插入相同RowKey的数据,则原先存在的数据会被新的数据给覆盖掉(和HashMap效果相同)。

排序原则HBase会把RowKey按照ASCII进行自然有序排序,所以反过来在设计RowKey的时候可以根据这个特点来设计完美的RowKey,利用好这个特性就是排序原则。

散列原则设计出的RowKey需要能够均匀的分布到各个RegionServer上。比如设计RowKey的时候,当Rowkey 是按时间戳的方式递增,就不要将时间放在二进制码的前面,可以将 Rowkey 的高位作为散列字段,由程序循环生成,可以在低位放时间字段,这样就可以提高数据均衡分布在每个Regionserver实现负载均衡的几率。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: