我有一个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行键的方式。
答案 0 :(得分:21)
应该如何设计行键,以便带有键〜10的行最后一次?
您以这种方式看到扫描输出,因为无论插入顺序如何,HBase中的rowkeys都会保持排序lexicographically。这意味着它们根据字符串表示进行排序。请记住,HBase中的rowkeys被视为具有字符串表示的字节数组。最低顺序rowkey首先出现在表格中。这就是为什么10出现在2之前,依此类推。请参阅此page上的行部分以了解有关此内容的更多信息。
当您使用零填充整数时,它们的自然顺序在按字典顺序排序时保持完整,这就是您看到扫描顺序与插入数据的顺序相同的原因。为此,您可以按照@shutty的建议设计行键。
我正在寻找一些推荐的方法或设计HBase行密钥的方式。
为了设计出好的设计,需要遵循一些通用的指导原则:
有关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的正长度,它将很好地排序。