我正在研究Hbase。我查询了Hbase如何使用LSM以排序顺序存储数据。
根据我的理解,Hbase使用LSM Tree进行大规模数据处理中的数据传输。当Data来自客户端时,它首先按顺序存储在内存中,然后排序并存储为B-Tree作为Store文件。而不是将Store文件与磁盘B-Tree(密钥)合并。这是对的吗 ?我错过了什么吗?
如果是,则在群集环境中。有多个RegionServers接受客户端请求。在这种情况下,所有Hlog(每个regionServer)如何与磁盘B-Tree合并(因为现有密钥分布在所有dataNode磁盘上)?
Hlog是否只将数据与同一regionServer的Hfile合并?
答案 0 :(得分:8)
你可以看一下这两篇描述你想要的内容的文章
http://blog.cloudera.com/blog/2012/06/hbase-io-hfile-input-output/
http://blog.cloudera.com/blog/2012/06/hbase-write-path/
简而言之:
就磁盘数据结构而言: http://blog.cloudera.com/blog/2012/06/hbase-io-hfile-input-output/ 上面的文章介绍了hfile格式...... 它只是一种附加格式,可以看作是一个b +树。 (请记住,这个b +树不能在适当的位置修改)
HLog仅用于"安全",一旦将数据写入hfiles,日志就会被丢弃
答案 1 :(得分:2)
根据HBase中的LSM树模型,数据由两部分组成 - 内存树,其中包含数据的最新更新和磁盘存储树,它将数据的其余部分排列成不可变顺序B-的形式树位于硬盘上。 HBase服务有时会决定内存中有足够的更改来将它们刷新到文件存储中。在这种情况下,它执行从虚拟空间到光盘的数据的滚动合并,执行类似于合并排序算法的合并步骤的操作。
在HBase基础架构中,此类数据模型基于多个组件,这些组件将整个群集中的所有数据组织为位于从属服务器上并由主要主服务驱动的LSM树的集合。该系统由以下组件驱动:
HMaster - 主HBase服务,通过管理和平衡它们之间的数据来维护从属Region Server节点的正确状态。此外,它还可以驱动存储中元数据信息的更改,例如表格或列创建和更新。
Zookeeper - 表示HBase服务及其客户使用的分布式缓存,用于存储有关命名和配置的最新协调信息。
区域服务器 - 以LSM-tree方式执行信息管理和存储的HBase工作节点 HDFS - 由场景后面的区域服务器用于实际存储数据
从低级别来看,HBase功能的大部分位于区域服务器内,该服务器对表执行读写工作。技术上,每个表都可以分布在不同的区域服务器上,作为一组称为HRegions的独立部分。单个区域服务器节点可以包含一个表的多个HRegions。每个HRegion保存在内存和磁盘空间之间共享的特定行范围,并按键属性排序。这些范围在不同区域之间不相交,因此我们可以在集群中继续它们的顺序行为。单个区域服务器HRegion包括以下部分:
预写日志(WAL)文件 - 在进入内存之前,每次写入操作都保留数据的第一个位置。正如我之前提到的,LSM树的第一部分保存在内存中,这意味着它可能会受到一些外部因素的影响,例如功率丢失。将这些操作的日志文件保存在一个单独的位置可以轻松地恢复这个部分,而不会有任何损失。
Memstore - 保留内存中信息的最新更新的已排序集合。它是前面描述的LMS树结构的第一部分的实际实现。定期执行滚动合并到本地硬盘驱动器上名为HFiles的商店文件
HFile - 表示从Memstore收到并保存在HDFS中的一小段日期。每个HFile都包含已排序的KeyValues集合和B-Tree +索引,它允许在不读取整个文件的情况下查找数据。 HBase定期对这些文件执行合并排序操作,使其符合标准HDFS块的配置大小,避免出现小文件问题
您可以通过推送数据并将其传递到整个LSM树过程来手动遍历这些元素。我在最近的文章中描述了如何做到这一点:
https://oyermolenko.blog/2017/02/21/hbase-as-primary-nosql-hadoop-storage/