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

时间:2013-07-22 16:07:27

标签: nosql row hbase

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

<prefix>~1
<prefix>~2
<prefix>~3
...
<prefix>~9
<prefix>~10

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

<prefix>~1
<prefix>~10
<prefix>~2
<prefix>~3
...
<prefix>~9

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

4 个答案:

答案 0 :(得分:21)

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

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

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

我正在寻找一些推荐的方法或设计HBase行密钥的方式。

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

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

有关rowkey设计的更多信息,请参阅此link

HTH

答案 1 :(得分:5)

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

<prefix>~0001
<prefix>~0002
<prefix>~0003
...
<prefix>~0009
<prefix>~0010

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

答案 2 :(得分:2)

单调增加密钥对于hbase来说不是一个好的模式。 你可以在这里阅读更多: http://hbase.apache.org/book/rowkey.design.html

还有OpenTSDB的链接解决了这个问题。

答案 3 :(得分:1)

如果可能,建议使用固定长度键。 Bytes.toBytes(Long值)可用于从计数器获取字节数组。对于小于Long.MAX_VALUE的正长度,它将很好地排序。