当regionserver收到来自客户端的Get请求时,调用接口
public Result get(byte[] regionName, Get get)
{
...
HRegion region = getRegion(regionName);
return region.get(get, getLockFromId(get.getLockId()));
...
}
我们看HRegion.get接口,其首先会做family检测,保证Get中的family与Table的相符,然后通过RegionScanner.next来返回result
而Scanner是Hbase读流程中的主要类,先做一个大概描述:
从Scanner的scan范围来分有RegionScanner,StoreScanner,MemstoreScanner,HFileScanner;根据名称很好理解他们的作用,而他们之间的关系:RegionScanner由一个或多个StoreScanner组成,StoreScanner由MemstoreScanner和HFileScanner组成;
再看RegionScanner类的构造形成过程:
List<KeyValueScanner> scanners = new ArrayList<KeyValueScanner>();
for (Map.Entry<byte[], NavigableSet<byte[]>> entry :
scan.getFamilyMap().entrySet())
{
Store store = stores.get(entry.getKey());
scanners.add(store.getScanner(scan, entry.getValue()));
}
this.storeHeap = new KeyValueHeap(scanners, comparator);
这段代码为RegionScanner类内部属性storeHeap初始化,其内容就是Region下面所有StoreScanner的和;storeHeap是一个KeyValueHeap,从字面可以理解result就是从中获取的
接着看store.getScanner(scan, entry.getValue())即StoreScanner类的构造形成过程:
//StoreScanner is a scanner for both the memstore and the HStore files
List<KeyValueScanner> scanners = new LinkedList<KeyValueScanner>();
// First the store file scanners
if (memOnly == false) {
List<StoreFileScanner> sfScanners = StoreFileScanner
.getScannersForStoreFiles(store.getStorefiles(), cacheBlocks, isGet);
// include only those scan files which pass all filters
for (StoreFileScanner sfs : sfScanners) {
if (sfs.shouldSeek(scan, columns)) {
scanners.add(sfs);
}
}
}
// Then the memstore scanners
if ((filesOnly == false) && (this.store.memstore.shouldSeek(scan))) {
scanners.addAll(this.store.memstore.getScanners());
}
return scanners;
一般情况下StoreScanner中添加了HFileScanner和MemStoreScanner;
StoreFileScanner的内部属性包括HFileScanner和Hfile.Reader,在添加前会根据timestamp,columns,bloomfilter过滤掉一部分
Scanner构造完毕以后,当最上层的RegionScanner.next时,首先会先从MemStoreScanner中获取,如果没有或者版本数不足,则再从HfileScanner中获取,而从HfileScanner获取时,先查看是否在blockcache中,如果MISS则再从底层的HDFS中获取block,并根据设置决定是否将Block cache到LruBlockCache中
分享到:
相关推荐
源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供实时访问。下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,专为处理海量数据而设计。源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整...
HBase是构建在Hadoop文件系统(HDFS)之上的开源数据库,专为处理大规模数据而设计。它支持实时读写,适用于半结构化和非结构化数据存储。 源码分析: 1. **目录结构**: 解压后的`hbase-book-master`包含项目的...
HBase是Apache软件基金会的一个开源项目,它是基于Google的Bigtable设计思想开发的,用于构建在分布式文件系统(如Hadoop HDFS)之上的大规模、高性能、列式存储的数据库。HBase 1.3.1是其稳定版本之一,为大数据...
通过分析源码,开发者可以深入理解分布式数据库的设计思想,而jar包则使开发者能够快速构建基于HBase的应用。不过需要注意的是,0.94.13已经是较旧的版本,最新的稳定版本可能会包含更多的功能和改进,因此在生产...
HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop之上的分布式列式数据库,特别适合处理大规模数据。其设计灵感来源于Google的Bigtable,提供高吞吐量的数据访问,支持PB级别的存储。在大数据领域,HBase...
- **Get和Put操作**:客户端通过HTable接口的get和put方法与HBase交互,发送请求到RegionServer。 - **Scanning**:用于批量获取数据,支持过滤器,优化数据检索效率。 - **Compaction**:定期合并region中的...
源码分析是理解HbaseClient工作原理的关键。通过阅读源码,我们可以发现HbaseClient在执行操作时,会先将请求序列化成protobuf消息,然后通过HBase的RPC协议发送到RegionServer。RegionServer接收到请求后,解析并...
三、HBase源码解析 3.1 数据模型 HBase的数据模型在源码中主要体现在`org.apache.hadoop.hbase.regionserver`包下的`Region`类,它是实际存储数据的单元,包含对行、列的管理。 3.2 操作API 客户端与HBase交互的...
通过阅读源码,我们可以学习到如何设计高效的数据模型,如何实现数据的分布式存储和检索,以及如何优化HBase的性能。例如,`hbase-book.zip`可能包含了书中提到的各种示例程序,这些程序展示了如何使用HBase的Java ...
而Phoenix作为一款建立在HBase之上的SQL查询引擎,极大地简化了NoSQL数据库的查询操作。本文将详细介绍如何编译CDH5.13中的Phoenix 4.11.0-HBase 1.2源码包。 首先,我们需要从Apache官方仓库获取Phoenix 4.14.0-...
HBase,全称为Apache HBase,是一款开源的分布式列式数据库,是构建在Hadoop文件系统(HDFS)之上的NoSQL数据库。HBase 3.0作为其重要的版本更新,带来了许多新特性和性能优化,对于大数据处理和实时分析有着显著...
五、HBase源码分析 深入HBase源码有助于理解其内部工作原理,例如RegionServer如何处理客户端请求,HMaster如何管理Region分配,以及数据的存储格式等。源码中的关键类如HRegion、HFile、WAL等,都是值得深入研究的...
4. **实时读写**:HBase支持毫秒级的读写操作,适合实时数据分析场景。 5. **水平扩展**:通过增加RegionServer节点实现横向扩展,适应大数据量增长。 6. **数据一致性**:通过ZooKeeper保证强一致性,确保数据的...
通过阅读和分析源码,我们可以学习到如何高效地利用HBase的批量操作、行键设计、 Region分布策略等核心特性,从而在实际项目中实现更高效的数据库操作。 总的来说,ella-hbase-0.96.2通过移除对JMX的部分依赖,转而...