Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HBase:数据是如何以排序方式写入HFile的?_Hbase_Hfile - Fatal编程技术网

HBase:数据是如何以排序方式写入HFile的?

HBase:数据是如何以排序方式写入HFile的?,hbase,hfile,Hbase,Hfile,我对HFiles有一个基本的怀疑 启动put/insert请求时,值首先写入WAL,然后写入memstore。memstore中的值以与HFile中相同的排序方式存储。一旦memstore已满,它就会被刷新到一个新的HFile中 现在,我已经读到HFile按排序顺序存储数据,即顺序行键将彼此相邻 这是100%真实的吗 例如:我首先使用行键1到1000写入行,但行键500除外。假设memstore现在已满,因此它将创建一个新的HFile,称之为HFile1。现在,这个文件是不可变的 现在,我将写第

我对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中,因此HFile1中的行键不按排序顺序排列。那么,粗体字的原始陈述正确吗

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

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

这是100%真实的吗

是的,这是100%准确。在单个HFile中具有的行键始终被排序

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

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

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

如果是,则行键500不在HFile1中,因此HFile1中的行键不按排序顺序排列。那么,粗体字的原始陈述正确吗

是的,在单个HFile中包含的行键始终被排序。HBase会定期执行合并多个HFile并将其重写为单个HFile的操作,这个新的HFile是压缩的结果,也会进行排序

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

在读取时,如果一个存储区有多个HFile,HBase将从所有HFiles中读取该行,检查该行是否存在,如果存在,还将从memstore读取。这样就可以得到最新的数据


HBase权威指南对HBase阅读路径的工作原理有很好的解释。

谢谢。HFiles的压缩周期性地发生,这意味着存在一种可能性,即rowkey 500不在具有rowkey 1-1000的HFile1中,而在具有rowkey 500和1001-2000的HFile 2中。现在,据我所知,当读取密钥时,首先读取HFile的FileTrail,然后读取HFile的FileInfo。FileInfo将在HFile中包含“最后一个键”,HFile读取器可以使用此信息决定是否必须读取HFile才能获取行键500。如果我的理解是正确的,那么HFile1将被读取,而HFile2将不被读取,正确吗?每个HFile被划分为块,默认为64KB。每个块包含实际的KV数据,并且有来自HFile2版本2的块级bloom过滤器和索引。如果没有为列族启用BloomFilter,则HBase将尝试读取所有HFiles,并通过扫描块索引查看行键是否存在。