HBase scan过程简析
1.核心组件及流程
- scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰;
- 具体来说,就是region→store→hfile/memstore,分别都有对应的scanner实现进行数据读取;
- scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理;
2.RegionScanner
- RegionScanner的实现类在HRegion内部定义,为RegionScannerImpl;
- 该类内部主要通过一个优先级队列(heap)和一个scanner类型的指针(current)进行驱动,不断的从StoreScanner中获取数据;
下面分步说明一下数据驱动的过程:
(图1)
(图2)
(图3)
(图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
- 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
- storeFileScanner是真正涉及到hfile数据读取的地方,会根据rowKey,基于内存中indexBlock的数据定位到具体的dataBlock位置,以block为单位进行读取;
- 读取后的block数据在内存中以ByteBuffer的形式存在,而blockSeek方法会将这个ByteBuffer的position推动到合适位置的过程;
- 接下来,会读取一个cell的数据作为返回,使上层的storeScanner能够据此对各个storeFileScanner进行排序;
- 值得一提的是,实际实现中,还存在lazySeek的优化,大致原理是根据hfile中存储的最小time,返回一个假的cell,如果该cell都不能排在前面,那就不需要关心真实的cell是什么了,等到该cell能够排在最前面的时候,再进行realSeek,这个机制对于各个hfile按时间存在明显分界并且主要读取近期数据的场景,可以有效减少实际的数据读取量;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker - trouble-shooting记录
本文不是写Docker是什么和Docker怎么用,而是记录Docker使用中碰到的问题和排查解决方式 1. 以非root用户运行docker $sudo groupadd docker #确保有docker用户组 $sudo usermod -aG docker $USER #将当前用户加入docker用户组 登出并重新登录后生效验证:$docker ps 2. 查看registry mirror的更改是否生效 $docker info查看最下面Registry Mirrors的内容 3. docker 启动失败 错误信息: $ systemctl status docker.service docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sat 2020-04-04 21:16:...
- 下一篇
MaxCompute问答整理之2020-03月
本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文。希望对大家有所帮助。 问题一、在 MaxCompute SQL执行过程中,报错Table xx has n columns, but query has m columns如何处理?MaxCompute SQL使用INSERT INTO/OVERWRITE插入数据时,需要保证SELECT查询出 来的字段和插入的表的字段匹配,匹配内容包括顺序、字段类型,总的字段数量。目前 MaxCompute不支持插入表的指定字段,其他字段为NULL或者其他默认值的情况,您可以 在SELECT的时候设置成NULL,例如SELECT ‘a’,NULL FROM XX。 问题二、MaxCompute 中使用什么方法可以实现相同字段连接,将gr
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案