HBase scan过程简析

简介: HBase scan过程简析。 scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰; 具体来说,就是region->store→hfile/memstore,分别都有对应的scanner实现进行数据读取; scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理; 2.

1.核心组件及流程

scan_

  • scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰;
  • 具体来说,就是region→store→hfile/memstore,分别都有对应的scanner实现进行数据读取;
  • scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理;

2.RegionScanner

序列图:https://www.processon.com/view/link/5d5cef1de4b0145255c20846

  • RegionScanner的实现类在HRegion内部定义,为RegionScannerImpl;
  • 该类内部主要通过一个优先级队列(heap)和一个scanner类型的指针(current)进行驱动,不断的从StoreScanner中获取数据;

下面分步说明一下数据驱动的过程:

(图1)

scan_RegionScanner_1

(图2)

scan_RegionScanner_2

(图3)

scan_RegionScanner_3

(图4)

scan_RegionScanner_4

假设startrow和stoprow分别为r1和r3。

  • 1:创建指定的各个列族对应的storeScanner,如果未指定则是全部列族;
  • 2:storeScanner创建过程中,会根据startrow参数,seek到对应cell;
  • 3:将这些storeScanner放入一个heap中,heap为优先级队列,比较器的compare方法中比较的是KeyValueScanner所peek到的cell大小,如图1;
  • 4:全部放入到heap使其有序,poll方法得到最小的storeScanner,即storeScannerB,将其赋值给current,如图2;
  • 5:调用current的next方法,该方法会获取一行的全部cell,获取完后内部已seek到下一行,如图3;
  • 6:再将current放回到heap中,此时会形成新的顺序,如图4;
  • 7:重复4到6步,直到新的行大于或等于r3;

3.StoreScanner

序列图:https://www.processon.com/view/link/5d5f4496e4b04e664f2ee80c

  • StoreScanner的数据驱动方式与RegionScanner类似,也是使用heap和current去进行控制;
  • 除了数据获取之外,该类比较重要的1个部分是数据的检查,相关逻辑封装在ScanQueryMatcher中;
  • ScanQueryMatcher中主要包含2个组件:DeleteTracker和ColumnTracker,前者负责处理delete逻辑,后者负责检查当前cell的column、version及value等是否符合要求;
  • 另外,在getScanners的过程中会根据keyRange、timeRange、bloomBlock等对storeFile进行过滤,以减少数据的读取;

matcher返回的code及含义说明如下:

#丢弃当前cell,继续处理下个cell
SKIP
 
#丢弃当前cell,并推进到下个column
SEEK_NEXT_COL
 
#丢弃当前cell,并推进到下个row
SEEK_NEXT_ROW
 
#保留当前cell,继续处理下个cell
INCLUDE
 
#保留当前cell,并推进到下个column
INCLUDE_AND_SEEK_NEXT_COL
 
 #保留当前cell,并推进到下个row
INCLUDE_AND_SEEK_NEXT_ROW
 
#当前row已完成
DONE
 
#整个scan已完成
DONE_SCAN
 
 #丢弃当前cell,并推进到下个指定的cell,由少数filter用到
SEEK_NEXT_USING_HINT

4.storeFileScanner

序列图:https://www.processon.com/view/link/5d638e4fe4b0145255c7c5e4

  • storeFileScanner是真正涉及到hfile数据读取的地方,会根据rowKey,基于内存中indexBlock的数据定位到具体的dataBlock位置,以block为单位进行读取;
  • 读取后的block数据在内存中以ByteBuffer的形式存在,而blockSeek方法会将这个ByteBuffer的position推动到合适位置的过程;
  • 接下来,会读取一个cell的数据作为返回,使上层的storeScanner能够据此对各个storeFileScanner进行排序;
  • 值得一提的是,实际实现中,还存在lazySeek的优化,大致原理是根据hfile中存储的最小time,返回一个假的cell,如果该cell都不能排在前面,那就不需要关心真实的cell是什么了,等到该cell能够排在最前面的时候,再进行realSeek,这个机制对于各个hfile按时间存在明显分界并且主要读取近期数据的场景,可以有效减少实际的数据读取量;
相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0
|
安全 Linux 分布式数据库
HBase中scan的ReadType探究
HBase中scan的ReadType存在pread和stream两种方式,本文对其原理和实现进行探究。
1528 0
|
Java Shell 分布式数据库
hbase shell实现原理简析
hbase的交互式命令行是通过jruby实现的,当我们输入hbase shell时,实际上最终执行的是org.jruby.Main,并以bin/hirb.rb作为参数,注意是根目录下bin目录中的hirb.
2004 0
|
分布式数据库 Hbase
hbase scan客户端服务端流程
hbase scan客户端服务端流程 一:基础知识了解: scanner可分为两种InternalScanner和KeyValueScanner,区别如下 1.
1386 0
|
API 分布式数据库 Hbase
|
算法 测试技术 分布式数据库
|
分布式数据库 Hbase 分布式计算
hbase源码系列(十五)终结篇&Scan续集-->如何查询出来下一个KeyValue
这是这个系列的最后一篇了,实在没精力写了,本来还想写一下hbck的,这个东西很常用,当hbase的Meta表出现错误的时候,它能够帮助我们进行修复,无奈看到3000多行的代码时,退却了,原谅我这点自私的想法吧。
3380 0
|
分布式数据库 Hbase
hbase源码系列(十二)Get、Scan在服务端是如何处理?
继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Delete一样,上一篇我本来只打算写Put的,结果发现Delete也可以走这个过程,所以就一起写了。
3488 0
|
Java 分布式数据库 Go
HBase的scan源码分析客户端部分之整体流程(一)
        scan的调用代码示例如下: // 创建HBase配置config Configuration config = HBaseConfiguration.create(); config.
1791 0