gpt4 book ai didi

nosql - 单调递增键的 HBase 行键设计

转载 作者:行者123 更新时间:2023-12-04 02:39:52 25 4
gpt4 key购买 nike

我有一个 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 中的行键保持排序 lexicographically与插入顺序无关。这意味着它们是根据它们的字符串表示进行排序的。请记住,HBase 中的行键被视为具有字符串表示形式的字节数组。最低顺序的行键首先出现在表中。这就是为什么 10 出现在 2 之前,依此类推。查看章节 在此 page了解更多信息。

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

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

为了设计出一个好的设计,需要遵循一些一般准则:

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

  • 看到这个 link有关行键设计的更多信息。

    HTH

    关于nosql - 单调递增键的 HBase 行键设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17792328/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com