我对HFiles有一个相当基本的怀疑。
当启动put/insert请求时,该值首先写入WAL,然后写入memstore。memstore中的值以与HFile相同的排序方式存储。一旦memstore满了,它就会被冲进一个新的HFile中。
现在,我已经读到HFile按排序顺序存储数据,即顺序行键将在彼此的旁边。
这是100%的事实吗?
例如:我首先用行键1到1000来写行,但行键500除外。假设memstore现在已经满了,所以它将创建一个新的HFile,称为HFile1。现在,这个文件是不可变的。
现在,我将编写行1001至2000,然后编写行键500。假设memstore已满,并将其写入HFile,则称为HFile2。
是这样发生的吗?
如果是,则行键500不在HFile1中,因此HFiles中的行键没有按排序顺序排列。那么,原来的粗体说法是正确的吗?
那么,当读取发生时,读取是如何发生的呢?
发布于 2014-11-02 21:44:55
HFile按排序顺序存储数据,即顺序行键将彼此相邻。 这是100%的事实吗?
是的,这是百分之百的准确。在单个RowKeys中的HFile总是被排序的。
我将写1001行到2000行,然后写行键500。假设memstore已满,并将其写入HFile,则称为HFile2。 是这样发生的吗?
是的,现在500人进入了第二个HFile的顶端。
如果是,则行键500不在HFile1中,因此HFiles中的行键没有按排序顺序排列。那么,原来的粗体说法是正确的吗?
是的,单个HFile中的行键总是排序的。HBase周期性地执行压实,这将合并多个HFiles并将它们重写为单个HFile,这个新的HFile (压缩的结果)也被排序。
那么,当读取发生时,读取是如何发生的呢?
在读取时,如果一个存储有多个HFile,HBase将从所有HFiles读取该行(检查该行是否在那里,如果已读取)以及从HFiles存储读取该行。这样它就能得到最新的数据。
HBase权威指南对HBase读取路径的工作原理有很好的解释。
https://stackoverflow.com/questions/26696212
复制相似问题