我正在研究 Hbase。我对 Hbase 如何使用 LSM 按排序顺序存储数据有疑问。
据我了解,Hbase在大规模数据处理中使用LSM Tree进行数据传输。当数据来自客户端时,它首先按顺序存储在内存中,然后排序并存储为 B-Tree 作为存储文件。比它将存储文件与磁盘 B 树(关键)合并。这是正确的吗 ?我错过了什么吗?
如果是,则在集群环境中。有多个接受客户端请求的 RegionServer。在那种情况下,(每个区域服务器的)所有 Hlog 如何与磁盘 B 树合并(作为现有 key 分布在所有数据节点磁盘上)?
是不是像Hlog一样只是合并同一个regionServer的Hfile的数据?
最佳答案
你可以看看这两篇文章,正是你想要的内容
http://blog.cloudera.com/blog/2012/06/hbase-io-hfile-input-output/
http://blog.cloudera.com/blog/2012/06/hbase-write-path/
简而言之:
- 客户端向负责处理key的region server发送数据
- (.META。包含每个区域的关键范围)
- 将用户操作(如put)写入Write-Ahead-Log(WAL,HLog)
- (日志仅用于“安全”,如果区域服务器崩溃,日志将被重放以恢复未写入磁盘的数据)
- 写入日志后,数据也写入MemStore
- ...一旦 memstore 达到阈值(conf 属性)
- memstore 被刷新到磁盘上,创建一个 hfile
- ...当 hfiles 的数量增长太多(conf 属性)时,压缩开始(合并)
在磁盘数据结构方面: http://blog.cloudera.com/blog/2012/06/hbase-io-hfile-input-output/ 上面的文章涵盖了 hfile 格式...... 它是一种仅附加格式,可以看作是一个 b+树。 (切记这个b+tree不能原地修改)
HLog只是为了“安全”,一旦数据写入hfiles,日志就可以扔掉
关于hadoop - Hbase 中的日志结构化合并树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762992/