HBase内部:如何在StoreFiles之间保留rowkey排序?

时间:2014-05-15 10:05:10

标签: hbase

在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集群。)

提前感谢您的帮助!

1 个答案:

答案 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。