什么是rowkey?

RowKey类似于主键,可以唯一的标识一行记录;

由于数据按照RowKey的字典序(byte order)排序存储,因此HBase中的数据永远都是有序的。

RowKey可以由用户自己指定,只要保证这个字符串不重复就可以了。

rowkey可否重复?

不可以!会被覆盖

hbase(main):006:0> put 'csdn:emp','rk0001','base_info:name','smith'
hbase(main):007:0> scan 'csdn:emp'
ROW                                     COLUMN+CELL
 rk0001                                 column=base_info:name, timestamp=1606653810373, value=smith
1 row(s) in 0.0270 seconds

hbase(main):008:0> put 'csdn:emp','rk0001','base_info:name','abc'
hbase(main):009:0> scan 'csdn:emp'
ROW                                     COLUMN+CELL
 rk0001                                 column=base_info:name, timestamp=1606653820715, value=abc

为什么要对rowkey设计进行优化?

HBase 中的行按行键按字典排序。此设计优化扫描,允许您将相关行或将一起读取的行彼此存储。但是,设计不佳的rowkey是热点的一个常见来源。当大量客户端流量定向到群集的一个节点或只有几个节点时,将发生热点。此流量可能表示读取、写入或其他操作。流量使负责托管该区域的单台计算机变得拥挤,导致性能下降,并可能导致区域不可用。这也可能对同一区域服务器托管的其他区域产生负面影响,因为该主机无法为请求的负载提供服务。设计数据访问模式,以便群集得到充分利用和均匀地利用,这一点非常重要。

为了防止在写入时出现热点,请设计行键,使真正需要位于同一区域的行是,但从大局看,数据将写入群集中的多个区域,而不是一次写入一个区域.

如何解决热点问题?

加盐

盐。从这个意义上说,盐化与加密有关,但是指将随机数据添加到行键的开始。在这种情况下,盐化是指向行键添加随机分配的前缀,以导致其排序方式与排序方式不同。可能的前缀数对应于要将数据跨传播的区域数。如果您有一些"热"行键模式,这些模式在其他分布更均匀的行中一遍又一遍出现,则盐分非常有用。考虑下面的示例,该示例显示盐分可以跨多个区域服务器分布写入负载,并说明了读取的一些负面影响。
举个例子

假设您有以下行键列表,并且表被拆分,以便字母表的每个字母都有一个区域。
前缀 'a' 是一个区域,前缀 'b' 是另一个区域。在此表中,以"f"为起点的所有行都在同一区域中。
此示例重点介绍具有如下键的行:

foo0001
foo0002
foo0003
foo0004          
        
现在,假设您希望将这些传播到四个不同的区域。您决定使用四种不同的盐:、、和 。在这种情况下,这些字母前缀将在不同的区域上。应用盐后,您有以下的行键代替。由于现在可以写入四个单独的区域,因此理论上,如果所有写入都写入到同一区域,则写入时吞吐量是四倍。abcd

a-foo0003
b-foo0001
c-foo0004
d-foo0002          
        
然后,如果添加另一行,将随机分配四个可能的盐值之一,最后接近现有行之一。

a-foo0003
b-foo0001
c-foo0003
c-foo0004
d-foo0002        
        
由于此赋值是随机的,因此如果要检索字典顺序中的行,则需要执行更多工作。这样,盐盐尝试增加写入时吞吐量,但在读取过程中具有成本。

哈希

哈希。您可以使用单向哈希,而不是随机赋值,该哈希会导致给定行始终使用相同的前缀"salted",这样,加载将分散到区域服务器,但允许在读取过程中具有可预测性。使用确定性哈希允许客户端重建完整的行键,并使用 Get 操作以正常方式检索该行。

反转

反转密钥。防止热点的第三个常见技巧是反转固定宽度或数字行键,以便更改最频繁(最小有效数字)的部分是第一个。这有效地随机化了行键,但牺牲了行排序属性。