12

我有一个 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

4 回答 4

28

应该如何设计行键以使键 ~10 的行排在最后?

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

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

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

为了设计一个好的设计,需要遵循一些一般性的指导方针:

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

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

高温高压

于 2013-07-31T12:03:00.400 回答
7

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

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

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

于 2013-07-31T07:03:24.723 回答
3

单调递增的键不是 hbase 的好模式。你可以在这里阅读更多:http: //hbase.apache.org/book/rowkey.design.html

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

于 2013-07-22T17:28:52.323 回答
1

如果可能的话,确实推荐使用固定长度的键。Bytes.toBytes(Long value) 可用于从计数器获取字节数组。对于小于 Long.MAX_VALUE 的正多头,它将很好地排序。

于 2013-07-23T22:37:09.073 回答