`

HBase get源码解析

阅读更多

 

 

客户端

获得RPC链接 递归查找对应rowkey的地址 递归:table - .METE. - ROOT

 

HConnectionManager - locateRegionInMeta
在metatable中查找region地址:
                metaLocation = locateRegion(parentTable,metaKey);

 

 

发送查询请求到客户端

 

服务端

一、实例化HRegion

获得Get请求,HRegionServer

 

public Result get(byte[] regionName,Get get){
HRegion region = getRegion(regionName);//1
return region.get(get,getLockFromId(get.getLockId()));//2
}

 

 

二、HRegion调用Get方法 

1.通过name获得HRegion

 2.HRegion运行get方法,检查rowkey,cf;

 

public Result get(final Get get,final Integer locakid)

 调用HRegion内部方法get

 

 

private List<KeyValue> get(Get get,boolean withCoprocessor)

 

 

三、实例化Scan,和Region迭代器RegionScanner,迭代查询Region数据

get方法中实例化Scan,实例化迭代Region的RegionScanner

             --HRegion调用instantialRegionScanner

                实例化内部类RegionScannerImpl

             --迭代cf,每个cf生成一个Store和负责迭代数据的StoreScanner

 

StoreScanner scanner = store.getScanner(scan,entry.getValue());

private List<KeyValueScanner> getScanners(Scan scan,final NavigableSet<byte[]> columns)

 

 

四、实例化StoreScanner,迭代每个cf的数据

 StoreScanner的内部变量keyValueHead,是keyValueSanner的集合

 

protected List<KeyValueScanner> getScanners(boolean cacheBlocks,boolean isGet,boolean isCompaction)

 此方法会实例化两种Scanner

  StoreScanner构造方法,获得两部分scanner

  

List<KeyValueScanner> scanners = getScannersNoCompaction();

 

   1.内存Scanner,负责迭代在内存中(LSM数据结构,未写到HFile中的数据)

 

memStoreScanners = this.memestore.getScanners()

   2.HFile的Scanner,负责迭代HFile,会实例化多个StoreFileScanner

 

 

storeFiles = this.getStorefiles()
List<StoreFileScanner> sfScanners = StoreFileScanner.getScannersForStoreFiles(storeFiles,cacheBlocks,isGet,isCompaction)

  返回所有keyValueScanner(内存的、文件的)

 

 

 

五、获得KeyValue结果

   RegionScannerImpl调用Next方法

 

public synchronized boolean next(List<KeyValue> outResults,int limit)
boolean returnResult = nextInternal(limit)

 在此方法中,生成keyvalue数据结果,通过RPC返回给客户端,查询就结束了

 

 

 

小结:

   从分析可见,hbase的get也是一次scan请求,因为Hbase的LSMTree结果,最小单位也只是HFile(hbase布隆过滤器可以有助判断rowkey不是在某个HFile中)。

  对比scan,get知道确切一个Region,limit为1;所以在region分配合理下,get速度可以到毫秒级。这里也就建议scan时,要有startrowkey,endrowkey,减少便利region数

 

 

辅助:

 

4 布隆过滤器(Bloom filters)
数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块。但是它的效用是有限的。HFile数据块的默认大小是64KB,这个大小不能调整太多。
如果你要查找一个短行,只在整个数据块的起始行键上建立索引无法给你细粒度的索引信息。例如,如果你的行占用100字节存储空间,一个64KB的数据块包含(64 * 1024)/100 = 655.53 = ~700行,而你只能把起始行放在索引位上。你要查找的行可能落在特定数据块上的行区间里,但也不是肯定存放在那个数据块上。这有多种情况的可能,或者该行在表里不存在,或者存放在另一个HFile里,甚至在MemStore里。这些情况下,从硬盘读取数据块会带来IO开销,也会滥用数据块缓存。这会影响性能,尤其是当你面对一个巨大的数据集并且有很多并发读用户时。
布隆过滤器允许你对存储在每个数据块的数据做一个反向测试。当某行被请求时,先检查布隆过滤器看看该行是否不在这个数据块。布隆过滤器要么确定回答该行不在,要么回答它不知道。这就是为什么我们称它是反向测试。布隆过滤器也可以应用到行里的单元上。当访问某列标识符时先使用同样的反向测试。
布隆过滤器也不是没有代价。存储这个额外的索引层次占用额外的空间。布隆过滤器随着它们的索引对象数据增长而增长,所以行级布隆过滤器比列标识符级布隆过滤器占用空间要少。当空间不是问题时,它们可以帮助你榨干系统的性能潜力。
你可以在列族上打开布隆过滤器,如下所示:
hbase(main):007:0> create 'mytable',
{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
BLOOMFILTER参数的默认值是NONE。一个行级布隆过滤器用ROW打开,列标识符级布隆过滤器用ROWCOL打开。行级布隆过滤器在数据块里检查特定行键是否不存在,列标识符级布隆过滤器检查行和列标识符联合体是否不存在。ROWCOL布隆过滤器的开销高于ROW布隆过滤器。

 

 

 

 

 

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    【No0057】HBase源码解析与开发实战.txt

    ### HBase源码解析与开发实战 #### 一、HBase简介 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了...

    HBase实战源码

    《HBase实战源码》是针对Apache HBase这一分布式、高性能、基于列族的NoSQL数据库的深度解析书籍。源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供...

    HBaseTest_hbase_源码

    《深入理解HBase:从HBaseTest源码解析开始》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop之上的分布式列式数据库,特别适合处理大规模数据。其设计灵感来源于Google的Bigtable,提供高吞吐量的...

    HBASE API

    **HBase API 深入解析** HBase,作为一个分布式、列式存储的NoSQL数据库,是Apache Hadoop生态系统中的重要组成部分。它被设计用来处理海量数据,支持高并发读写操作,尤其适用于实时大数据查询场景。HBase API是...

    hbase-1.2.6-bin+src.tar.rar

    本文将围绕"Hbase-1.2.6-bin+src.tar.rar"这一资源,深入探讨HBase的核心概念、架构、功能以及源码解析。 一、HBase概述 1.1 核心概念 - 表(Table):HBase中的数据组织方式,由多个行组成。 - 行(Row):通过...

    C#使用Thrift2操作HBase数据库

    HBase返回的结果通常是二进制的,需要解码后才能解析为有意义的数据。 在描述中提到的“便于快速入门”,可能包含了基础的示例代码或教程,例如如何设置连接参数,如何构造put和get请求,以及如何处理响应。文件名...

    [原创]HbaseClient

    通过阅读源码,我们可以发现HbaseClient在执行操作时,会先将请求序列化成protobuf消息,然后通过HBase的RPC协议发送到RegionServer。RegionServer接收到请求后,解析并执行对应的操作,最后将结果返回给客户端。 ...

    No.1HBase3.0张铎.zip

    - HBase的下载与编译:获取源码,进行编译并安装。 - 配置文件详解:hbase-site.xml、regionservers等关键配置文件的设置。 - 初始化HBase:启动Master和RegionServer,创建第一个表。 4. **HBase操作与管理** ...

    phoenix4.13.1-hbase1.2-cdh5.13源码可编译parcel集成

    它将SQL查询转换为HBase的Get和Scan操作,大大提升了数据查询效率。在CDH环境中,使用Parcel分发Phoenix,可以简化部署过程,确保与CDH其他组件的兼容性。 对于开发人员来说,掌握Phoenix的源码编译,可以定制特定...

    hbase-0.98.12.1-hadoop2-bin.tar.gz

    《HBase 0.98.12.1 on Hadoop 2:深入解析与实践》 HBase,全称为Hadoop Base,是一款基于Google Bigtable理念设计的开源分布式数据库,是Apache软件基金会的重要项目之一。它专为大规模数据集(数十亿行,百万列)...

    Hbase实战

    七、源码解析 对于希望深入了解HBase的开发者,阅读源码是必不可少的。HBase的开源特性使其内部机制透明,可以通过源码学习其数据分布、并发控制、故障恢复等机制。 总结,HBase是一款强大的大数据存储解决方案,...

    HBase SQL Phoenix

    2. 编译式查询:Phoenix将SQL查询编译成HBase的Get和Put操作,减少了中间解析步骤,提高了性能。 3. 分区和索引:Phoenix支持基于列的分区,以及创建二级索引,优化查询性能。 4. 动态Schema:Phoenix允许在运行时...

    HBase start

    以上就是关于HBase启动的全面解析,以及如何通过Java API进行基本操作。理解这些知识,对于管理和开发HBase应用至关重要。在实际使用中,还需要考虑如性能优化、故障恢复、扩展性等问题,这些都是HBase在大数据场景...

    源码笔记资料(1).zip

    总结,这份资料集为学习和使用HBase提供了一条清晰的路径,从基础安装到源码解析,再到实战演练,覆盖了HBase学习的全过程。通过深入学习,你可以更好地驾驭这个强大的大数据存储系统,应对日益增长的数据处理需求。

    Java网络爬虫蜘蛛源码

    源码可能使用了这些库来模拟用户向服务器发送GET或POST请求,获取网页内容。例如,通过设置URL、请求头和参数来定制请求,并处理服务器返回的响应。 其次,HTML解析是爬虫的重要环节。Java有Jsoup库,它提供了简洁...

    hadoop使用

    8. **HBase操作Java API**:使用HBase Java API可以进行更复杂的操作,如连接到HBase(`HBaseConfiguration.create()`)、创建表(`HTableDescriptor`)、写入数据(`Put`)、读取数据(`Get`)和扫描数据(`Scan`)...

    kylinolap_github_io-源码.rar

    - **查询执行**:将查询计划转化为HBase的Get和Scan操作,实现快速的数据检索。 6. **接口层** - **RESTful API**:提供HTTP接口,支持各种编程语言与Kylin交互,简化集成过程。 - **Web UI**:提供图形化界面,...

    Java爬虫详细完整源码实例

    这些库提供了发送GET、POST请求,设置请求头,处理cookies等功能。 2. **HTML解析**:抓取到的网页内容是HTML格式,需要解析成DOM树以便提取所需信息。Java中常用的HTML解析库有Jsoup,它提供了一种简洁的API来解析...

Global site tag (gtag.js) - Google Analytics