HBase内部:如何在存储文件之间保留行键顺序?

HBase内部:如何在存储文件之间保留行键顺序?,hbase,Hbase,在HBase中,如何在StoreFiles之间保留行键顺序? (在存储文件之间是否保留行-行-键顺序?) 这是我对内部工作的理解(可能有缺陷……): 当MemStore变得太大时,会刷新它并创建一个新的StoreFile。 MemStore中的信息是按rowkey(->)排序的,因此也是在StoreFile中排序的 e、 g.冲洗两次后,我们可以得到: 存储文件1: 键1… 键3… 键4… 存储文件2: 键2… 键5… 键6… 但我们真正想要快速检索(?)的是: 存储文件1: 键1… 键2… 键

在HBase中,如何在StoreFiles之间保留行键顺序?
(在存储文件之间是否保留行-行-键顺序?)

这是我对内部工作的理解(可能有缺陷……):
当MemStore变得太大时,会刷新它并创建一个新的StoreFile。
MemStore中的信息是按rowkey(->)排序的,因此也是在StoreFile中排序的

e、 g.冲洗两次后,我们可以得到:

存储文件1:
键1…
键3…
键4…

存储文件2:
键2…
键5…
键6…

但我们真正想要快速检索(?)的是:

存储文件1:
键1…
键2…
键3…

存储文件2:
键4…
键5…
键6…

如果存储文件之间未保留行键顺序,则可能出现性能问题(参见示例):
-要获取与rowkey关联的数据,我们必须对每个StoreFile进行(二进制?)搜索…
-此外,地区分裂还需要做更多的工作

(上下文:我试图优化并理解正在工作的测试HBase集群。)


提前感谢您的帮助

行键顺序仅保留在一个StoreFile中,而不是在StoreFile之间

获取时,不需要进行二进制搜索,因为:

1) HFiles具有类似于b树的索引

2) 从多个StoreFile读取时,将创建StoreFile读取器的堆(PriorityQueue)。堆中的StoreFile读取器将根据其当前键值进行比较。我们总是从当前键值顺序为“最小”的读卡器读取数据。(不过,像lazy seek这样的优化会使事情变得更加复杂。)

有关更多信息,请参阅org.apache.hadoop.hbase.regionserver.KeyValueHeap

至于区域分割,将使用“参考”旧区域的上/下半部分。之后,压缩将为新区域生成新的实际HFiles

有关更多信息,请参阅org.apache.hadoop.hbase.io.HalfStoreFileReader