7.存储模型
regionserver负责region内数据的存储及处理客户端的读写请求:
写请求:当regionserver接受到写请求,先写入一个WAL(write-ahead log) HLog中(同一regionserver的所有log写入同一文件中);然后再写入缓存HStore中;
读请求:先检查HStore中是否存在被请求数据,不存在则读MapFiles
Flush缓存:当缓存达到配置的大小,则flush到磁盘,写入到新的MapFile,并在HLog中做一个标记。(当重做该日志时,忽略上次标记前的记录)
Flush时regionserver仍会将读写请求挂起,直至新的MapFile产生成功
Compaction:当flush产生的MapFile数量过多时,会运行compaction合并多个MapFile并产生新的Map,以减少文件数量并清除过期和已被删除数据。
minor compaction,合并近期产生的几个MapFile
major compaction,合并所有MapFile
Split:当一个region的所有MapFiles大小超过指定值(256M),则将父region分为两半,但子region仍从父的MapFile读取。当一个子region触发了compaction,则会复制数据到自己的目录,
当两个子region均执行过compaction,父region将会被回收
由此可见,HBase数据有三种不同存储:HLog,HStore和HFile,并由HRegion管理
(1)写(Put)过程:
HRegionServer实现HRegionInterface接口,该接口定义了对region读写操作的接口,客户端获取该接口在本地的代理,调用put系列方法写入数据;
a.首先,HRegionServer检查该regionserver是否正在关闭、文件系统是否可用
b.从onlineRegions中获得要写入的HRegion,并检查该regionserver上所有region的使用的缓存大小是否超过上限,则逐个flush占用内存最大的region,
并将该region加入compactSplitThread线程的队列中以等待compact(????)
c.调用HRegion的put方法写入数据
d.检查HRegion是否处于只读模式
e.检查HRegion的Memstore大小是否超过hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier,若超过了则请求flush并阻塞写操作
f.doMiniBatchPut方法写入数据,对每个Put,先根据HRegionInfo检查是否存在对应的column family
g.获取与要操作的行对应的Lock:若Client提供了Lock,则判断给的LockId是否存在对应的行;Client未提供Lock,则产生一个lock,并保存(internalObtainRowLock方法)
h.设置插入cell的value的timestamp(updateKVTimestamps方法)
i.将Put操作写入到WALEdit(Write ahead log),并append到HLog中(addFamilyMapToWALEdit和HLog.append方法)
j.写入到memstore中,由ReadWriteConsistencyControl保持读写一致性,调用Store.add方法
k.释放锁并返回写入数据所占空间的大小
(2)读(Get)过程:HRegionServer实现HRegionInterface接口,该接口提供get方法
a.首先,HRegionServer检查该regionserver是否正在关闭、文件系统是否可用
b.从onlineRegions中获得要读取的HRegion,调用HRegion的get方法
c.若Get设置了column family,检查是否存在;否则读取HTableDescriptor中所有的column family
d.根据Get创建对应Scan实例,设置startRow、stopRow、filter、maxVersions、TimeRange等(Get操作对应的Scan实例startRow=stopRow)
e.HBase定义了两个接口InternalScanner和KeyValueScanner,InternalScanner用于在regionserver上读取下一行指定列的所有键值对
KeyValueScanner用于从各种存储中读取下一个键-值对。在查询中涉及到各个实现见下图:
RegionScanner:实现InternalScanner接口,它对要扫描的column family对应的Store创建KeyValueScanner实例(StoreScanner)(每个column family中的列存储在同一Store中),并将这些StoreScanner的实例交给KeyValueHeap管理
调用其next(List results)方法时,委托给各个column family的StoreScanner。
StoreScanner:实现InternalScanner和KeyValueScanner接口,创建对StoreFile和MemStore进行扫描的KeyValueScanner实例(StoreFileScanner和MemeStore),并将这些Scanner交给KeyValueHeap管理,而StoreFileScanner对HFile文件的读取又交给了HFileScanner
分享到:
相关推荐
7. **源代码**:"src"表示压缩包包含了源代码,这意味着你可以深入了解Phoenix的实现细节,进行定制化开发或者排查问题。源代码通常包括编译脚本、测试用例、模块化的源文件等。 8. **构建与部署**:获取源代码后,...
这个压缩包“hbase-0.98.6-cdh5.3.6.zip”包含了HBase的完整源代码、配置文件、二进制库以及相关的文档,使得用户可以在CDH5.3.6环境中快速部署和使用HBase服务。其内部结构通常包括以下部分: 1. **源代码**:允许...
《深入剖析HBase源代码:hbase-0.98.23》 HBase,作为Apache的一个开源项目,是构建在Hadoop之上的分布式、版本化、列族式的NoSQL数据库,它提供了高可靠性、高性能、可伸缩的数据存储解决方案。本文将基于hbase-...
在大型分布式系统中,HBase提供实时读写访问,且能够支持PB级别的数据存储。它是构建在Hadoop文件系统(HDFS)之上的,因此能够充分利用Hadoop的可扩展性和容错性。 标题中的"hbase-1.2.4-bin.tar.gz"表明这是HBase...
主节点(Master)负责元数据管理、 Region分配以及故障恢复,而Region Server则负责实际的数据存储和服务请求。 2. **列式存储**:与传统的关系型数据库不同,HBase将数据按照列族(Column Family)存储,每个列族...
2. `hbase-2.2.2-src.tar.gz`:这是HBase的源代码包,适合开发者进行二次开发或者想要深入理解HBase工作原理的用户。你可以编译源代码,生成自己的二进制文件,或者查看、修改源代码以满足特定需求。 安装HBase涉及...
6. **src**:源代码,对于开发者来说,可以查看和修改HBase的源代码。 7. **webapps**:HBase自带的Web管理界面的资源文件。 8. **logs**:运行时的日志文件。 9. **bin/hbase**:启动HBase的主脚本,通过它可以启动...
6. **src目录**:源代码文件,如果你需要查看或修改HBase的源码,这个目录是起点。 7. **LICENSE**和**NOTICE**文件:分别包含了HBase的许可证信息和版权声明。 在部署HBase之前,我们需要先确保已经安装了Java...
5. `src`目录:源代码,对于开发者来说很有用,可以查看和修改HBase的实现细节。 6. `LICENSE`和`NOTICE`文件:关于HBase的版权和许可信息。 7. `bin/start-hbase.sh`和`bin/stop-hbase.sh`:启动和停止HBase服务的...
"apache-phoenix-4.8.1-HBase-0.98-src.tar.gz" 是Phoenix项目的4.8.1版本,针对HBase 0.98的源代码包。 在这款源码包中,开发者和研究人员可以深入理解Phoenix的工作原理,以及如何自定义和优化其功能。以下是这个...
关于压缩包内的子文件,"hbase-2.0.0-alpha3"可能指的是HBase的源代码或者二进制发行版。如果是源代码,开发者可以深入理解HBase的工作原理,甚至对其进行定制或贡献代码。如果是二进制发行版,用户可以直接编译安装...
在HBase 1.4.0的压缩包中,"hbase-1.4.0"目录可能包含了源代码、编译后的二进制文件、配置文件、文档以及示例等,帮助用户安装、配置和使用HBase。为了利用这个版本,开发者或管理员需要解压文件,按照官方文档或...
具体来说,`hbase-2.2.6-bin.tar.gz`是一个经过打包的HBase源代码和相关文件,解压后会得到一个完整的HBase运行环境。 HBase的核心特性包括: 1. **列族存储**:与传统的关系型数据库不同,HBase将数据按照列族...
HBase是Apache Hadoop生态系统中的一个分布式列式数据库,它主要设计用于处理大规模的数据存储和检索。这个压缩包“hbase-1.1.2-bin”包含了HBase 1.1.2版本的源码、编译后的二进制文件以及相关依赖,适合在大数据...
解压“hbase-1.2.5”后,你可以查看源代码,理解HBase如何处理请求、如何与HDFS和Zookeeper交互,以及如何实现其独特的数据模型和一致性保证。此外,开发者可以进一步探索HBase的构建过程,了解如何编译、测试和部署...
源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整源代码,对于理解其内部工作原理、进行二次开发或调试是非常有价值的。 HBase的核心概念包括: 1. 表:HBase中的表由行和列族组成,表名全局唯一。...
`tools4j-config-provider-hbase-filter` 可能是为HBase提供定制化配置和过滤机制的库,使得开发者能够更灵活地处理和过滤存储在HBase中的数据。 【描述】"scalaj-collection.zip, Scalaj系列" 暗示这是一个与Scala...
HBase是Google Bigtable的开源实现,是一个高度可扩展的分布式数据库,特别适合存储大规模结构化数据。0.98.8是HBase的一个版本,它在Hadoop 1.x版本上运行,提供对大规模数据集的实时访问。Hadoop 1.x系列是Hadoop...
HBase的设计理念是将数据存储为稀疏、多维度的映射表,其中行键、列族、列限定符和时间戳共同定义了每个单元格的位置。这种设计使得HBase在大数据场景下能够实现快速的随机读写操作。 源码包中的内容通常包括以下...