HBase行键设计,用于单调增加键

May*_*ank 10 hbase row nosql

我有一个HBase表,我正在写行键,如:

<prefix>~1
<prefix>~2
<prefix>~3
...
<prefix>~9
<prefix>~10
Run Code Online (Sandbox Code Playgroud)

HBase shell上的扫描给出了一个输出:

<prefix>~1
<prefix>~10
<prefix>~2
<prefix>~3
...
<prefix>~9
Run Code Online (Sandbox Code Playgroud)

如何设计行键以使带键的行<prefix>~10最后?我正在寻找一些推荐的方法或更方便的设计HBase行键的方法.

Tar*_*riq 21

应该如何设计行键,以便键〜10的行最后?

您可以通过这种方式查看扫描输出,因为无论插入顺序如何,HBase中的rowkeys都按字典顺序排序.这意味着它们根据字符串表示进行排序.请记住,HBase中的rowkeys被视为具有字符串表示的字节数组.最低顺序rowkey首先出现在表格中.这就是为什么10出现在2之前,依此类推.请参阅此页面上的" "部分以了解有关此内容的更多信息.

当您使用零填充整数时,它们的自然顺序在按字典顺序排序时保持完整,这就是为什么您看到扫描顺序与插入数据的顺序相同的原因.为此,您可以按照@shutty的建议设计行键.

我正在寻找一些推荐的方法或更方便的设计HBase行键的方法.

为了设计出好的设计,需要遵循一些通用的指导原则:

  • 保持rowkey尽可能小.
  • 避免使用单调增加的rowkeys,例如时间戳等.这是一个糟糕的shecma设计,导致RegionServer热点.如果你无法避免这种使用,比如散列或盐渍,以避免热点.
  • 如果可能,避免使用字符串作为rowkeys.与其整数或长表示相比,数字的字符串表示占用更多字节.例如:长是8个字节.您可以在这八个字节中存储最多18,446,744,073,709,551,615的无符号数.如果将此数字存储为字符串 - 假设每个字符有一个字节 - 则需要将近3倍的字节.
  • 使用某种机制(如散列),以便在区域未均匀加载的情况下均匀分布行.您还可以创建预分割表来实现此目的.

有关rowkey设计的更多信息,请参阅此链接.

HTH


shu*_*tty 5

HBase按字典顺序存储rowkeys,因此您可以尝试将此模式与固定长度的rowrey一起使用:

<prefix>~0001
<prefix>~0002
<prefix>~0003
...
<prefix>~0009
<prefix>~0010
Run Code Online (Sandbox Code Playgroud)

请记住,您还应该使用随机前缀来避免区域热点(当单个区域接受大多数写入时,而其他区域处于空闲状态).


Udy*_*Udy 3

对于 hbase 来说,单调递增的键并不是一个好的模式。您可以在这里阅读更多信息: http ://hbase.apache.org/book/rowkey.design.html

还有一个OpenTSDB的链接可以解决这个问题。