我有一个 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 行键的方法。
应该如何设计行键以使键 ~10 的行排在最后?
您可以通过这种方式看到扫描输出,因为 HBase 中的行键保持按字典顺序排序,而与插入顺序无关。这意味着它们是根据它们的字符串表示进行排序的。请记住,HBase 中的行键被视为具有字符串表示形式的字节数组。最低顺序的行键首先出现在表中。这就是为什么 10 出现在 2 之前,依此类推。请参阅此页面上的行部分以了解更多信息。
当您用零填充整数时,它们的自然顺序在按字典顺序排序时保持不变,这就是为什么您看到扫描顺序与插入数据的顺序相同的原因。为此,您可以按照@shutty 的建议设计您的行键。
我正在寻找一些推荐的方法或更流行的设计 HBase 行键的方法。
为了设计一个好的设计,需要遵循一些一般性的指导方针:
有关行键设计的更多信息,请参阅此链接。
高温高压
HBase 按字典顺序存储 rowkey,因此您可以尝试将此模式与固定长度的 rowrey 一起使用:
<prefix>~0001
<prefix>~0002
<prefix>~0003
...
<prefix>~0009
<prefix>~0010
请记住,您还应该使用随机前缀来避免区域热点(当单个区域接受大部分写入,而其他区域处于空闲状态时)。
单调递增的键不是 hbase 的好模式。你可以在这里阅读更多:http: //hbase.apache.org/book/rowkey.design.html
还有一个指向OpenTSDB的链接可以解决这个问题。
如果可能的话,确实推荐使用固定长度的键。Bytes.toBytes(Long value) 可用于从计数器获取字节数组。对于小于 Long.MAX_VALUE 的正多头,它将很好地排序。