4

我对 HFiles 有一个相当基本的怀疑。

当发起 put/insert 请求时,首先将值写入 WAL,然后再写入 memstore。memstore 中的值以与 HFile 中相同的排序方式存储。一旦 memstore 满了,它就会被刷新到一个新的 HFile 中。

现在,我已经读到HFile 按排序顺序存储数据,即顺序行键将彼此相邻

这是100%真实的吗?

例如:我首先用 rowkey 1 到 1000 写入行,除了 rowkey 500。假设 memstore 现在已满,因此它将创建一个新的 HFile,称为 HFile1。现在,这个文件是不可变的。

现在,我将写入第 1001 到 2000 行,然后写入行键 500。假设 memstore 已满并写入 HFile,称为 HFile2。

那么,事情是这样发生的吗?

如果是,则行键 500 不在 HFile1 中,因此 HFiles 中的行键没有排序。那么,粗体的原始陈述是否正确?

那么,当读取发生时,读取是如何发生的呢?

4

1 回答 1

6

HFile 以排序顺序存储数据,即顺序行键将彼此相邻。

这是100%真实的吗?

是的,这是 100% 准确的。单个 HFile 中的 RowKeys 总是被排序的。

我将写第 1001 到 2000 行,然后我写行键 500。假设 memstore 已满,它写入一个 HFile,称之为 HFile2。

那么,事情是这样发生的吗?

是的,现在 500 到达第二个 HFile 的顶部。

如果是,则行键 500 不在 HFile1 中,因此 HFiles 中的行键没有排序。那么,粗体的原始陈述是否正确?

是的,单个 HFile 中的行键总是被排序的。HBase 定期执行压缩,这将合并多个 HFile 并将它们重写为单个 HFile,这个作为压缩结果的新 HFile 也被排序。

那么,当读取发生时,读取是如何发生的呢?

在一次读取时,如果一个存储有多个 HFile,HBase 将从所有 HFile 中读取该行(检查该行是否存在以及是否已读取)以及 memstore。所以它可以得到最新的数据。

HBase Definitive Guide 对 HBase 读取路径的工作原理有很好的解释。

于 2014-11-02T21:44:55.950 回答