在HBase中,如何在StoreFiles之间保留rowkey排序? (在StoreFiles之间保留IS行rowkey排序?)
这是我对内部运作的不足(可能有缺陷......):
当MemStore变得太大时,它会被刷新并创建一个新的StoreFile
MemStore中的信息按rowkey排序( - >因此也在StoreFile中)。
e.g。经过2次冲洗,我们可以:
StoreFile 1:
key1 ...
key3 ...
key4 ...
StoreFile 2:
key2 ...
key5 ...
key6 ...
但我们真正想要(?)快速检索的是:
StoreFile 1:
key1 ...
key2 ...
key3 ...
StoreFile 2:
key4 ...
key5 ...
key6 ...
潜在的性能问题如果StoreFiles之间没有保留rowkey排序(参见示例):
- 要获取与rowkey相关的数据,我们必须对每个StoreFile进行(二进制?)搜索...
- 而且一个地区分割会更加有效。
(上下文:我尝试优化 - 并了解 - 工作中的测试HBase集群。)
提前感谢您的帮助!
答案 0 :(得分:0)
行键顺序仅保留在一个StoreFile中,而不保留在StoreFiles之间。
当我们获取时,不需要二进制搜索,因为:
1)HFiles具有类似b树的索引
2)从多个StoreFiles读取时,会创建StoreFile读取器的堆(PriorityQueue)。堆中的StoreFile读取器根据其当前KeyValue进行比较。我们总是从当前KeyValue按顺序“最小”的阅读器中读取。 (尽管像懒惰搜索这样的优化使事情变得更复杂。)
请参阅org.apache.hadoop.hbase.regionserver.KeyValueHeap了解更多信息。
对于区域分割,将使用旧区域的上/下半部分的“参考”。之后,压缩将为新地区带来新的实际HFile。
有关更多信息,请参阅org.apache.hadoop.hbase.io.HalfStoreFileReader。