HBase数据读取流程解析
一 客户端GET读
客户端GET读其实没有什么逻辑,就简单几个步骤:
1.1 connection 根据表名,行健得到从哪一个RegionServer和Region上去读
1.2 通过Region信息和和GET对象构造一个GET Request
1.3 通过RPC把GET请求提交到服务器端,以得到返回结果
二 RegionServer GET读
2.1 首先将GET请求反序列化
2.2 然后对row key 和 family进行校验
2.3 通过get请求构造一个scan对象
2.4 根据scan实例化一个RegionScanner,默认的实现是RegionScan
nerImpl。在实例化的时候会做以下几件事情:
# 设置region
# 设置caching,batch,stopRow等
# 设置readpoint
# 实例化KeyValue Heap: 一个表可能有多个列簇,每一个列簇对应Store, 所以一个Region可能有多个StoreScanner,KeyValueHeap作用就是合并多个KeyValueScanner
# 根据store 得到对应的store scanner,并且根据以下条件把store scanner添加到不同的集合中去:
=> 有filter
=>scan设置了doLoadColumnFamiliesOnDemand为true
=>设置了的filter的isFamilyEssential
如果以上条件都满足,都放入join scanner 集合中,否则放入store scanner集合中,因为以上条件一般情况下很难满足,除非有一些特殊的业务逻辑,否则一般都是store scanner
并且根据store scanner 集合 和 joined scanner集合构造2个堆:
store heap 和 joined heap
2.5 调用RegionScannerImpl#nextRaw
2.6 然后KeyValyeHeap(storeHeap)根据store scanner得到一个cell
并判断当前的row key是否是stop row key. 如果不是这里可能有很多结果,并且判断是否需要对row进行过滤,如果需要则过滤一些cells
2.7 保存结果,直到达到limit数量
2.8 返回结果
三 客户端SCAN流程
3.1 调用HTable#getScanner得到ResultScanner
3.2 如果是small scan,但是又设置了batch(limit)则不允许
3.3 设置cache
3.4 根据是否反向,是否是small scan创建不同的scanner对象
我们默认以ClientScanner为例:
会初始化一些参数,比如tableName,connection,客户端重试次数,scan的最大结果数,timeout,cache等
3.5 初始化scanner,并且构造BoundedCompletionService,包含需要执行的task,已经完成的task和线程池,利用线程池完成任务的调度与执行,并同步获取结果
3.6 ResultScanner继承自Iterable接口,那么其实现ClientScanner也会有hasNext和next方法,如果没有则继续向上查找父类,next方法就是去遍历数据
3.7 如果cache 没有数据,且scanner为closed,则返回null;如果只是cache 没有数据,则把数据加载到缓存,然后查询的时候cache有数据,则直接返回。
3.8 初始化remainingResultSize 和 countdown:
remainingResultSize:RPC调用获取的数据总大小
countdown:RPC调用获取的总行数
然后通过RPC调用去RegionServer真正获取数据。
数据缓存到cache中
注意:从这一点上看,这里有一点懒加载的味道,本地缓存有的,先从本地去,本地没有了才去服务器拿,然后再放入缓存。
四 服务器端SCAN流程
客户端通过ScannerCallable#call调用RSRPCService#scan方法,从服务器上查询数据。
4.1 首先将scan请求反序列化
4.2 判断是否客户端携带的有scannerId参数,如果有则根据客户端携带的scannerId去得到RegionScanner,否则根据客户端传递过来Region参数去得到RegionScanner
4.3 调用RegionScannerImpl#nextRaw方法,去填充数据
描述HBase中scan和get的功能以及实现的异同
HBase数据读取流程解析相关推荐
- HBase - 数据写入流程解析
本文由 网易云 发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻 ...
- HBase_HBase 数据读取流程解析
和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片.多块缓存甚至多个数据存 ...
- HBase原理之数据读取流程
和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片.多块缓存甚至多个数据存 ...
- 德国海曼HTPA 32x32d热成像传感器代替MLX90640之EEPROM数据读取和解析
EEPROM数据读取和解析 上一篇我们简单介绍了热成像传感器德国海曼的HTPA 32x32d,本文主要进一步介绍内部EEPROM数据读取和解析. 存储结构一览 首先,很简单的IIC总线协议写好,调试好 ...
- hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程
一.开篇 Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施.因其具备了海量数据分布式存储能力,针对不同批处理业务的大吞吐数据计算承载力,使其综合复杂度要远远高于其他数 ...
- hbase数据读取优化_从hbase读取数据优化策略和实验对照结果
起因:工作须要.我须要每5分钟从hbase中.导出一部分数据,然后导入到ES中.可是在開始阶段编写的python脚本,我发现从hbase读取数据的速度较慢,耗费大量的时间.影响整个导数过程,恐怕无法在 ...
- HBase数据存取流程
一.HBase的特点是什么 1.HBase一个分布式的基于列式存储或者行式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. 2.HBase适合存储半结构化或非结构化数据,对于 ...
- hbase数据读取优化_read读取优化_HBase最佳实践_HBase开发指南_云数据库 HBase - 阿里云...
其实HBase还是比较灵活的,关键看你是否使用得当,以下主要列举一些读的优化.HBase在生产中往往会遇到Full GC.进程OOM.RIT问题.读取延迟较大等一些问题,使用更好的硬件往往可以解决一部 ...
- 一文带你了解HBase读取数据详细流程
HBase数据读取流程 1.hbase数据读取流程简单描述 一般来说,在描述hbase读取流程的时候,简单的描述如下: 1).客户端从zookeeper中获取meta表所在的regionser ...
最新文章
- LeetCode Scramble String
- 赠票福利 | 2019人工智能计算大会即将开幕,与王恩东、陆永青、王海峰等专家共话AI计算技术与未来...
- AsyncHttpServer 异步回调,并发
- springboot项目中session和cookie
- 红黑树,看不懂你找我
- go linux环境搭建,Linux 下 Go 环境搭建以及 Gin 安装
- model存储 swift_Swift语言IOS8开发战记10.Data Model
- python类库32[多线程同步Lock+RLock+Semaphore+Event]
- python import 类如何捕获clrt c_Python3 与 C# 扩展之~基础衍生
- 自定义异常并抛出,捕获
- 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况(split、zip...)
- C# 跨线程调用form控件技巧及byte[]与string型相互转换
- live2d_原画人插画教程,想知道live2d虚拟主播是怎么制作出来的吗?
- 演绎类清吧音响怎么选?
- 对话腾讯17级员工张正友博士:有关梦想、成长和焦虑
- 荣耀热键驱动无法安装
- mac安装破解idea
- Leetcode题解 二分查找
- Graylog和ELK的简单对比
- 基于深度学习的红外和可见光图像融合论文及代码整理
热门文章
- excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
- 华为服务器虚拟化断电,服务器断电日志查看
- pulsar基础(六)——namespace的基本操作
- 兰州大学计算机调剂2020,兰州大学2020考研调剂公告
- linux lnmp1.5.tar.gz,Linux 下lnmp
- java线程交替执行_Java synchronized线程交替运行实现过程详解
- php图像无法显示,php – 无法显示图像,因为它包含错误[图像生成器]
- Java 蓝桥杯 算法 和为T
- 二级C语言程序设计备考方法
- arduino怎么和C语言程序通信,c – 如何将arduino库与标准C代码一起使用