`
shenchunhui
  • 浏览: 147196 次
  • 来自: 杭州
社区版块
存档分类
最新评论

Hbase 源码分析之 Regionserver上的 Get 全流程

阅读更多
当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中
分享到:
评论
2 楼 chen030112 2014-04-10  
很喜欢博主的文章,刚刚用豆约翰博客备份专家备份了您的全部博文。
1 楼 心昱111 2013-07-14  
你好,我问一下,在hbase查询的时候,如果我没有设置版本数,他默认给我拿的是最新的版本,这里我有个疑问,他是怎么定位到最新的版本的?  谢谢

相关推荐

    HBase实战源码

    源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供实时访问。下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于...

    hbase-0.98.1源码包

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,专为处理海量数据而设计。源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整...

    hbase权威指南源码

    HBase是构建在Hadoop文件系统(HDFS)之上的开源数据库,专为处理大规模数据而设计。它支持实时读写,适用于半结构化和非结构化数据存储。 源码分析: 1. **目录结构**: 解压后的`hbase-book-master`包含项目的...

    Hbase1.3.1源码

    HBase是Apache软件基金会的一个开源项目,它是基于Google的Bigtable设计思想开发的,用于构建在分布式文件系统(如Hadoop HDFS)之上的大规模、高性能、列式存储的数据库。HBase 1.3.1是其稳定版本之一,为大数据...

    hbase-0.94.13 jar和源码

    通过分析源码,开发者可以深入理解分布式数据库的设计思想,而jar包则使开发者能够快速构建基于HBase的应用。不过需要注意的是,0.94.13已经是较旧的版本,最新的稳定版本可能会包含更多的功能和改进,因此在生产...

    HBaseTest_hbase_源码

    HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop之上的分布式列式数据库,特别适合处理大规模数据。其设计灵感来源于Google的Bigtable,提供高吞吐量的数据访问,支持PB级别的存储。在大数据领域,HBase...

    hbase-0.98.6.1-src.zip

    - **Get和Put操作**:客户端通过HTable接口的get和put方法与HBase交互,发送请求到RegionServer。 - **Scanning**:用于批量获取数据,支持过滤器,优化数据检索效率。 - **Compaction**:定期合并region中的...

    [原创]HbaseClient

    源码分析是理解HbaseClient工作原理的关键。通过阅读源码,我们可以发现HbaseClient在执行操作时,会先将请求序列化成protobuf消息,然后通过HBase的RPC协议发送到RegionServer。RegionServer接收到请求后,解析并...

    hbase-1.2.6-bin+src.tar.rar

    三、HBase源码解析 3.1 数据模型 HBase的数据模型在源码中主要体现在`org.apache.hadoop.hbase.regionserver`包下的`Region`类,它是实际存储数据的单元,包含对行、列的管理。 3.2 操作API 客户端与HBase交互的...

    hbase权威指南.源代码

    通过阅读源码,我们可以学习到如何设计高效的数据模型,如何实现数据的分布式存储和检索,以及如何优化HBase的性能。例如,`hbase-book.zip`可能包含了书中提到的各种示例程序,这些程序展示了如何使用HBase的Java ...

    CDH5.13-phoenix-4.11.0-HBase-1.2源码包 编译可用

    而Phoenix作为一款建立在HBase之上的SQL查询引擎,极大地简化了NoSQL数据库的查询操作。本文将详细介绍如何编译CDH5.13中的Phoenix 4.11.0-HBase 1.2源码包。 首先,我们需要从Apache官方仓库获取Phoenix 4.14.0-...

    No.1HBase3.0张铎.zip

    HBase,全称为Apache HBase,是一款开源的分布式列式数据库,是构建在Hadoop文件系统(HDFS)之上的NoSQL数据库。HBase 3.0作为其重要的版本更新,带来了许多新特性和性能优化,对于大数据处理和实时分析有着显著...

    源码笔记资料(1).zip

    五、HBase源码分析 深入HBase源码有助于理解其内部工作原理,例如RegionServer如何处理客户端请求,HMaster如何管理Region分配,以及数据的存储格式等。源码中的关键类如HRegion、HFile、WAL等,都是值得深入研究的...

    Hbase 安装与基本使用

    4. **实时读写**:HBase支持毫秒级的读写操作,适合实时数据分析场景。 5. **水平扩展**:通过增加RegionServer节点实现横向扩展,适应大数据量增长。 6. **数据一致性**:通过ZooKeeper保证强一致性,确保数据的...

    ella-hbase-0.96.2:根据ella hbase-0.94修改,取消部分jmx数据获取方式,使用标准hbase java api进行数据获取

    通过阅读和分析源码,我们可以学习到如何高效地利用HBase的批量操作、行键设计、 Region分布策略等核心特性,从而在实际项目中实现更高效的数据库操作。 总的来说,ella-hbase-0.96.2通过移除对JMX的部分依赖,转而...

Global site tag (gtag.js) - Google Analytics