我有一个 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 中的行键保持排序按字典顺序 http://en.wikipedia.org/wiki/Lexicographical_order与插入顺序无关。这意味着它们根据字符串表示形式进行排序。请记住,HBase 中的行键被视为具有字符串表示形式的字节数组。最低顺序的行键首先出现在表中。这就是为什么 10 出现在 2 之前,依此类推。请参阅各部分Rows在此page http://wiki.apache.org/hadoop/Hbase/DataModel了解更多相关信息。
当您用零填充整数时,它们的自然顺序在按字典顺序排序时保持不变,这就是为什么您看到的扫描顺序与插入数据的顺序相同。为此,您可以按照 @shutty 的建议设计行键。
我正在寻找一些推荐的方法或更流行的设计 HBase 行键的方法。
为了设计出好的设计,需要遵循一些一般准则:
- 使行键尽可能小。
- 避免使用单调递增的 rowkey,例如时间戳等。这是一个糟糕的 shecma 设计,会导致 RegionServer 热点。如果您无法避免这种情况,请使用某种方式,例如散列或加盐以避免热点。
- 如果可能,请避免使用字符串作为行键。数字的字符串表示形式与其整数或长表示形式相比需要更多字节。例如 :一个long是8个字节。您可以在这八个字节中存储最多 18,446,744,073,709,551,615 的无符号数。如果您将此数字存储为字符串(假设每个字符一个字节),则需要近 3 倍的字节。
- 使用某种机制(例如散列),以便在区域加载不均匀的情况下获得行的均匀分布。您还可以创建预分割表来实现此目的。
看到这个link http://hbase.apache.org/book/rowkey.design.html有关行键设计的更多信息。
HTH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)