`
san_yun
  • 浏览: 2663429 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

HBase的get过程(一)

 
阅读更多

原文:http://punishzhou.iteye.com/blog/1258848

 

0.90.X的get和scan操作原理上是比较一致的,get操作都变为scan操作。不过在分析之前我们还是从get说起

话不多说首先看看get这个接口,hbase客户端对于get有以下几种:

Java代码  收藏代码
  1. public Get(byte [] row)  
Java代码  收藏代码
  1. public Get(byte [] row, RowLock rowLock)  

 其中rowlock主要是用来保证行的事务性,即每个get是以一个row来标记的一个row中可以有很多family和column

get还有很多函数如addfamily,addcolumn,这里我主要以指定row family column来get数据

 

ok我们来看HTable的get操作

Java代码  收藏代码
  1. public Result get(final Get get) throws IOException {  
  2.     return connection.getRegionServerWithRetries(  
  3.         new ServerCallable<Result>(connection, tableName, get.getRow()) {  
  4.           public Result call() throws IOException {  
  5.             return server.get(location.getRegionInfo().getRegionName(), get);  
  6.           }  
  7.         }  
  8.     );  
  9.   }  

 这也是一个RPC调用的过程且其返回结果为Result。

1.调用HConnectManger的getRegionServerWithRetries(ServerCallable<T> callable)

callable.instantiateServer(tries != 0);
          return callable.call();

这两步主要是找到该get的row所在的region,locateRegion

这个过程以后再来分析,总之就是找到该get所在的region,并与该region所在server通信

我们主要来看RegionServer端的Get操作,主要是region的get操作

 

Java代码  收藏代码
  1. List<KeyValue> result = get(get);  
Java代码  收藏代码
  1. private List<KeyValue> get(final Get get) throws IOException {  
  2.    Scan scan = new Scan(get);  
  3.   
  4.    List<KeyValue> results = new ArrayList<KeyValue>();  
  5.   
  6.    InternalScanner scanner = null;  
  7.    try {  
  8.      scanner = getScanner(scan);  
  9.      scanner.next(results);  
  10.    } finally {  
  11.      if (scanner != null)  
  12.        scanner.close();  
  13.    }  
  14.    return results;  
  15.  }  

 上述这个过程就是region的get过程,我们用下图来进行一个简单的描述

 

每个region中有一个regionscanner,每个regionscanner中维持一个heap的优先级队列,其中包含所有的storescanner,每个storescanner中包含一个Memstorescanner和n个Hfilescanner

进行查找时首先会定位到hfilestore或是memstore,找到这个get的row起始位置

 

在HFile或是memstore中数据视安从小到大进行排序的,排序规则是按keyvalue的大小,row,family,column,timestamp,最后是type。

 



 

上图就是模拟hfile里面keyvalue的一个排序规则。

哪些get的话如果没有指定时间戳的话会返回最近的一个值。,get也可以制定取回的版本数。

如果我们需要取回3个版本如上图所示

首先每个Hfile会定位到该row的起始处位置如此处在这3个Hflie的开头,若指定的column是C1

然后比较这三个文件开头的keyvalue大小,显然第三个R1,cf,c1,9最小,故首先取它

然后该文件指针往下移,重新比较当前指针的最小值,此时第一个文件的R1,cf,c1,8最小故第二个版本取它

然后指针下移继续比较知道满足版本数为止

分享到:
评论

相关推荐

    kettle集群搭建以及使用kettle将mysql数据转换为Hbase数据

    Kettle是一款开源的数据集成工具,主要用于ETL(Extract-Transform-Load)过程,能够实现数据的抽取、清洗、转换和加载等功能。Kettle支持多种数据源,并且可以通过图形界面设计数据流,非常适合大规模数据处理场景。 ...

    hbase的rowkey设计与hbase的协处理器运用.docx

    HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一个基于 HDFS 的分布式、面向列的 ...

    hbase数据可视化系统

    SpringBoot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如JDBC、MongoDB、JPA、RabbitMQ、Quartz等,只需少量配置就能创建一个独立的、生产级别的基于...

    Hbase实验报告.pdf

    在实验过程中,可能会遇到启动HBase Shell的困扰。这通常是因为没有启动HBase服务或者环境变量配置不正确。解决方法是首先确保HBase服务正常运行,然后通过以下命令启动Shell: ```shell hbase shell ``` 如果出现...

    HBase实现批量存取

    HBase是一种分布式、高性能、基于列族的NoSQL数据库,由Apache基金会开发并维护,它在大规模数据存储和实时查询方面表现出色。本项目实现了在Eclipse环境下对HBase的批量存取操作,这对于理解HBase的工作原理以及...

    HBase查询的深入研究

    在实际查询过程中,HBase会通过poll方法从队列头部取出storefile,读取并返回第一条记录。然后,它会比较队列中剩余storefile的第一条记录和当前storefile的第二条记录。如果前者更大,就返回当前storefile的第二条...

    C#操控hbase数据库

    总之,C#操作HBase是一个结合了分布式数据库技术与面向对象编程的过程,它涉及到数据模型设计、API调用、性能优化等多个方面。通过使用专门为C#编写的库,可以简化这一过程,使得非Java背景的开发者也能轻松地利用...

    Hbase 安装与基本使用

    本文将深入探讨HBase的安装过程以及基本使用方法,旨在帮助初学者快速上手。 **一、HBase简介** HBase是Google Bigtable的开源实现,它在Hadoop文件系统(HDFS)之上构建,提供了高度可扩展性和实时读写能力。HBase...

    spring操作hbase demo

    在IT行业中,Spring框架是Java领域最常用的轻量级开源框架之一,而HBase则是一个分布式、基于列族的NoSQL数据库,适用于处理大规模数据。本教程将详细讲解如何使用Spring来操作HBase,这对于大数据处理和分布式系统...

    最新版linux hbase-2.3.3-bin.tar.gz

    hbase(main):004:0&gt; get 'users', 'user1' ``` HBase 2.3.3还包括对性能优化、稳定性增强、新的API支持等方面的改进。例如,RegionSplitPolicy优化了区域分裂策略,以提高负载均衡;而Cell级别的ACL增强了数据安全...

    hbase-2.2.3-bin.tar.gz

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在Hadoop生态系统中,HBase提供了实时读写能力,支持PB级别的数据存储。这次我们讨论的是HBase的2.2.3版本...

    java大数据作业_3HBase

    在HBase中,表结构由一系列的行组成,每行都有唯一的row key,并且每个单元格都存储在列族下。为了描述这样一个表结构,我们可以使用Java中的Map来表示列族,List来表示具体的列名。以下是一个简单的示例代码: ```...

    springboot集成phoenix+hbase

    在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程。而Phoenix是一个开源的SQL层,它构建在HBase之上,提供了高性能的数据库查询能力。本示例将详细解释如何将Spring...

    thrift操作Hbase数据库

    这个项目中的代码文件`C# thrift2ToHbase`应该包含了实现这些功能的具体代码示例,可以帮助我们深入理解这一过程。学习并实践这个项目,不仅可以提升对Thrift和Hbase的理解,也有助于提升在分布式大数据环境下的编程...

    hbase权威指南源码

    解压后的`hbase-book-master`包含项目的基本目录结构,如`src/main/java`用于存放Java源代码,`src/main/resources`存储资源配置文件,`pom.xml`是Maven项目对象模型,定义了项目的构建过程和依赖关系。 2. **...

    hbase- java开发连接工具类

    3. **RPC机制**:HBase使用远程过程调用(RPC)与RegionServer进行通信,处理数据请求。这个JAR包包含了相关的RPC实现。 4. **行键(RowKey)索引**:HBase是一种列族式数据库,行键是其主要的索引方式。`hbase-...

    大数据HBASE考题材料

    - HBase是开源的:虽然题目中提到“不是开源的”这个选项不正确,但HBase确实是由Apache软件基金会维护的一个开源项目。 - 面向列:HBase是基于列族的数据库,这意味着数据存储和查询都是按列族进行的。 - 分布式...

    java访问Hbase数据库Demo

    以上就是使用Java访问Hbase的基本操作,这个例子中展示了创建表、插入、查询、删除和修改数据的过程。通过这个Demo,你可以了解Hbase与Java交互的基本步骤,并以此为基础进行更复杂的操作,如批量操作、扫描等。请...

    java从本地读文件并上传Hbase

    以下是一个详细的过程,讲解如何实现这个功能。 首先,确保你的开发环境已经配置了Java和HBase的相关依赖。你需要添加HBase的客户端库到你的项目中,这通常通过Maven或Gradle的依赖管理工具来完成。例如,在Maven的...

Global site tag (gtag.js) - Google Analytics