原文:http://punishzhou.iteye.com/blog/1258848
0.90.X的get和scan操作原理上是比较一致的,get操作都变为scan操作。不过在分析之前我们还是从get说起
话不多说首先看看get这个接口,hbase客户端对于get有以下几种:
- public Get(byte [] row)
- public Get(byte [] row, RowLock rowLock)
其中rowlock主要是用来保证行的事务性,即每个get是以一个row来标记的一个row中可以有很多family和column
get还有很多函数如addfamily,addcolumn,这里我主要以指定row family column来get数据
ok我们来看HTable的get操作
- public Result get(final Get get) throws IOException {
- return connection.getRegionServerWithRetries(
- new ServerCallable<Result>(connection, tableName, get.getRow()) {
- public Result call() throws IOException {
- return server.get(location.getRegionInfo().getRegionName(), get);
- }
- }
- );
- }
这也是一个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操作
- List<KeyValue> result = get(get);
- private List<KeyValue> get(final Get get) throws IOException {
- Scan scan = new Scan(get);
- List<KeyValue> results = new ArrayList<KeyValue>();
- InternalScanner scanner = null;
- try {
- scanner = getScanner(scan);
- scanner.next(results);
- } finally {
- if (scanner != null)
- scanner.close();
- }
- return results;
- }
上述这个过程就是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是一款开源的数据集成工具,主要用于ETL(Extract-Transform-Load)过程,能够实现数据的抽取、清洗、转换和加载等功能。Kettle支持多种数据源,并且可以通过图形界面设计数据流,非常适合大规模数据处理场景。 ...
HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一个基于 HDFS 的分布式、面向列的 ...
在实验过程中,可能会遇到启动HBase Shell的困扰。这通常是因为没有启动HBase服务或者环境变量配置不正确。解决方法是首先确保HBase服务正常运行,然后通过以下命令启动Shell: ```shell hbase shell ``` 如果出现...
SpringBoot是Spring框架的一个扩展,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如JDBC、MongoDB、JPA、RabbitMQ、Quartz等,只需少量配置就能创建一个独立的、生产级别的基于...
HBase是一种分布式、高性能、基于列族的NoSQL数据库,由Apache基金会开发并维护,它在大规模数据存储和实时查询方面表现出色。本项目实现了在Eclipse环境下对HBase的批量存取操作,这对于理解HBase的工作原理以及...
在实际查询过程中,HBase会通过poll方法从队列头部取出storefile,读取并返回第一条记录。然后,它会比较队列中剩余storefile的第一条记录和当前storefile的第二条记录。如果前者更大,就返回当前storefile的第二条...
总之,C#操作HBase是一个结合了分布式数据库技术与面向对象编程的过程,它涉及到数据模型设计、API调用、性能优化等多个方面。通过使用专门为C#编写的库,可以简化这一过程,使得非Java背景的开发者也能轻松地利用...
本文将深入探讨HBase的安装过程以及基本使用方法,旨在帮助初学者快速上手。 **一、HBase简介** HBase是Google Bigtable的开源实现,它在Hadoop文件系统(HDFS)之上构建,提供了高度可扩展性和实时读写能力。HBase...
在IT行业中,Spring框架是Java领域最常用的轻量级开源框架之一,而HBase则是一个分布式、基于列族的NoSQL数据库,适用于处理大规模数据。本教程将详细讲解如何使用Spring来操作HBase,这对于大数据处理和分布式系统...
hbase(main):004:0> get 'users', 'user1' ``` HBase 2.3.3还包括对性能优化、稳定性增强、新的API支持等方面的改进。例如,RegionSplitPolicy优化了区域分裂策略,以提高负载均衡;而Cell级别的ACL增强了数据安全...
在HBase中,表结构由一系列的行组成,每行都有唯一的row key,并且每个单元格都存储在列族下。为了描述这样一个表结构,我们可以使用Java中的Map来表示列族,List来表示具体的列名。以下是一个简单的示例代码: ```...
在IT行业中,Spring Boot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程。而Phoenix是一个开源的SQL层,它构建在HBase之上,提供了高性能的数据库查询能力。本示例将详细解释如何将Spring...
这个项目中的代码文件`C# thrift2ToHbase`应该包含了实现这些功能的具体代码示例,可以帮助我们深入理解这一过程。学习并实践这个项目,不仅可以提升对Thrift和Hbase的理解,也有助于提升在分布式大数据环境下的编程...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在Hadoop生态系统中,HBase提供了实时读写能力,支持PB级别的数据存储。这次我们讨论的是HBase的2.2.3版本...
解压后的`hbase-book-master`包含项目的基本目录结构,如`src/main/java`用于存放Java源代码,`src/main/resources`存储资源配置文件,`pom.xml`是Maven项目对象模型,定义了项目的构建过程和依赖关系。 2. **...
3. **RPC机制**:HBase使用远程过程调用(RPC)与RegionServer进行通信,处理数据请求。这个JAR包包含了相关的RPC实现。 4. **行键(RowKey)索引**:HBase是一种列族式数据库,行键是其主要的索引方式。`hbase-...
- HBase是开源的:虽然题目中提到“不是开源的”这个选项不正确,但HBase确实是由Apache软件基金会维护的一个开源项目。 - 面向列:HBase是基于列族的数据库,这意味着数据存储和查询都是按列族进行的。 - 分布式...
以上就是使用Java访问Hbase的基本操作,这个例子中展示了创建表、插入、查询、删除和修改数据的过程。通过这个Demo,你可以了解Hbase与Java交互的基本步骤,并以此为基础进行更复杂的操作,如批量操作、扫描等。请...
以下是一个详细的过程,讲解如何实现这个功能。 首先,确保你的开发环境已经配置了Java和HBase的相关依赖。你需要添加HBase的客户端库到你的项目中,这通常通过Maven或Gradle的依赖管理工具来完成。例如,在Maven的...