一  客户端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数据读取流程解析相关推荐

  1. HBase - 数据写入流程解析

    本文由  网易云 发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻 ...

  2. HBase_HBase 数据读取流程解析

    和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片.多块缓存甚至多个数据存 ...

  3. HBase原理之数据读取流程

    和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片.多块缓存甚至多个数据存 ...

  4. 德国海曼HTPA 32x32d热成像传感器代替MLX90640之EEPROM数据读取和解析

    EEPROM数据读取和解析 上一篇我们简单介绍了热成像传感器德国海曼的HTPA 32x32d,本文主要进一步介绍内部EEPROM数据读取和解析. 存储结构一览 首先,很简单的IIC总线协议写好,调试好 ...

  5. hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

    一.开篇 Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施.因其具备了海量数据分布式存储能力,针对不同批处理业务的大吞吐数据计算承载力,使其综合复杂度要远远高于其他数 ...

  6. hbase数据读取优化_从hbase读取数据优化策略和实验对照结果

    起因:工作须要.我须要每5分钟从hbase中.导出一部分数据,然后导入到ES中.可是在開始阶段编写的python脚本,我发现从hbase读取数据的速度较慢,耗费大量的时间.影响整个导数过程,恐怕无法在 ...

  7. HBase数据存取流程

    一.HBase的特点是什么 1.HBase一个分布式的基于列式存储或者行式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. 2.HBase适合存储半结构化或非结构化数据,对于 ...

  8. hbase数据读取优化_read读取优化_HBase最佳实践_HBase开发指南_云数据库 HBase - 阿里云...

    其实HBase还是比较灵活的,关键看你是否使用得当,以下主要列举一些读的优化.HBase在生产中往往会遇到Full GC.进程OOM.RIT问题.读取延迟较大等一些问题,使用更好的硬件往往可以解决一部 ...

  9. 一文带你了解HBase读取数据详细流程

    HBase数据读取流程 1.hbase数据读取流程简单描述 ​ 一般来说,在描述hbase读取流程的时候,简单的描述如下: ​ 1).客户端从zookeeper中获取meta表所在的regionser ...

最新文章

  1. LeetCode Scramble String
  2. 赠票福利 | 2019人工智能计算大会即将开幕,与王恩东、陆永青、王海峰等专家共话AI计算技术与未来...
  3. AsyncHttpServer 异步回调,并发
  4. springboot项目中session和cookie
  5. 红黑树,看不懂你找我
  6. go linux环境搭建,Linux 下 Go 环境搭建以及 Gin 安装
  7. model存储 swift_Swift语言IOS8开发战记10.Data Model
  8. python类库32[多线程同步Lock+RLock+Semaphore+Event]
  9. python import 类如何捕获clrt c_Python3 与 C# 扩展之~基础衍生
  10. 自定义异常并抛出,捕获
  11. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况(split、zip...)
  12. C# 跨线程调用form控件技巧及byte[]与string型相互转换
  13. live2d_原画人插画教程,想知道live2d虚拟主播是怎么制作出来的吗?
  14. 演绎类清吧音响怎么选?
  15. 对话腾讯17级员工张正友博士:有关梦想、成长和焦虑
  16. 荣耀热键驱动无法安装
  17. mac安装破解idea
  18. Leetcode题解 二分查找
  19. Graylog和ELK的简单对比
  20. 基于深度学习的红外和可见光图像融合论文及代码整理

热门文章

  1. excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  2. 华为服务器虚拟化断电,服务器断电日志查看
  3. pulsar基础(六)——namespace的基本操作
  4. 兰州大学计算机调剂2020,兰州大学2020考研调剂公告
  5. linux lnmp1.5.tar.gz,Linux 下lnmp
  6. java线程交替执行_Java synchronized线程交替运行实现过程详解
  7. php图像无法显示,php – 无法显示图像,因为它包含错误[图像生成器]
  8. Java 蓝桥杯 算法 和为T
  9. 二级C语言程序设计备考方法
  10. arduino怎么和C语言程序通信,c – 如何将arduino库与标准C代码一起使用