原文: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最小故第二个版本取它
然后指针下移继续比较知道满足版本数为止
相关推荐
hadoop hive hbase安装过程
java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行
删除Hbase中某个表的一列值 命令 java -jar deleteOneColumn.jar(这个文件的路径) '表名' '列簇名' '列名'
主要介绍了基于springboot集成hbase过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
HBASE的一个读取数据流程的解析,清晰的画出整个过程,十分有利于理解
来自一位老学姐的Hbase安装详细教程(清华大学镜像下)及基本操作,希望能带给你们些许帮助。主要包含Hbase的下载过程及其遇到的小问题,后续会继续完善该文档!
人脸识别,车辆识别,一人一档,一车一档 hadoop map reduce hbase
hbase-hbck2-1.1.0-SNAPSHOT.jar
hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...
HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
C#通过thrift连接hbase操作步骤,含有thrift客户端测试代码。
2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...
1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...
HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...
HBase 是一个开源的、分布式的、版本化的 NoSQL 数据库(也即非关系型数据库),它利用 Hadoop 分布式文件系统(Hadoop Distributed File System,HDFS)提供分布式数据存储。与传统的关系型数据库类似,HBase 也以...
Hbase2.2.4安装包,HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供...
HBase+ElasticSearch搭建过程详解
HBase开发实战,HBase学习利器:HBase实战
NULL 博文链接:https://lakerhu.iteye.com/blog/2369798