HBase读链路分析

简介:HBase的存储引擎是基于LSM-Like树实现的,更新操作不会直接去更新数据,而是使用各种type字段(put,delete)来标记一个新的多版本数据,采用定期compaction的形式来归档合并数据。这种数据结构将写操作变得非常简单且高效,但是却给读造成了很大的困扰。读取过程需要根据列族读取不同HFile中的数据;还需要根据版本进行过滤,同时对已经标记删除的数据也要进行过滤;硬盘中的数据与MemStore中的数据重合时,还需要执行合并,最后在内存中拼接成一行完整的数据再向上返回。 本文粗粒度地展示了HBase的读取链路,欢迎一起探讨交流~

正文之前

在讲HBase的读路径时,我们先来看几个简单的类图。

InternalScanner是一个Interface主要提供了两个方法,next(List<Cell> result)方法——获取下一行的数据。而next(List<Cell> result, ScannerContext scannerContext)提供功能相同,只不过允许传入一个ScannerContext用以记录当前scan任务的上下文,判断是否可以提前结束、是否要去读下一列、是否要去读下一行等。并且发生在InternalScanner中的数据比较等操作,都是基于byte[](而不用先转化为RowResults),更加接近于数据在物理上的存储形式,可以获得更高的性能。

KeyValueScanner也是一个接口,换成CellScanner可能更容易理解。对,它主要提供在一个“可读取的对象上”,获取cell的能力。这里使用“可读取的对象”这个词,主要是因为它可以是一个物理概念上的HFile,但也可以是逻辑意义上有迭代读取能力的scanner。

最后一个关键的类就是KeyValueHeap,该类实现了KeyValueScanner与InternalScanner接口,具备了获取cell及获取行的能力。KeyValueHeap中还有一个关键的属性,为heap,它是一个PriorityQueue<KeyValueScanner>对象,comparator = CellComparatorImp(即按照key的格式:rowkey:family:qualifier:timestamp)。即KeyValueHeap允许传入多个KeyValueScanner,通过PriorityQueue的形式将这些scanner管理起来,向上提供获取cell及获取行数据的能力!

有了InternalScanner,KeyValueScanner和KeyValueHeap其实已经可以做很多事情了。

我们知道,HBase的查询抽象地来看的话,是表现为下面这个流程的:

即从不同的HFile中进行数据读取,在内存中进行一个MergeSort,拼接成一行数据向上返回。

你们看KeyValueScanner、InternalScanner是不是就像其负责中HFile的读取Scanner,而KeyValueHeap负责的其实就是图中的MergeSort的任务。KeyValueHeap控制着下层KeyValueScanner、InternalScanner的数据读取,KeyValueScanner、InternalScanner是真正读取数据的Scanner。

好,大体的流程思路已经讲清楚了。其实HBase的读取流程远比这复杂,涉及的对象也更多,但有了上面的基础相信可以理解得很容易,接下来我们来仔细看看HBase的读取流程。

正文

我们从RegionScanner出发,仔细看看HBase的读取流程。

上图中的RegionScanner主要靠成员变量storeHeap,joinedHeap(KeyValueHeap)进行数据读取迭代。而StoreScanner也不是一个单纯的Scanner,而是扮演了跟RegionScanner类似的角色,它也拥有自己的heap,以此来进行数据的读取。跟【正文之前】说的一样,KeyValueHeap控制着下层KeyValueScanner、InternalScanner的数据读取,KeyValueScanner、InternalScanner是真正读取数据的Scanner。只不过RegionScanner中多嵌了一层StoreScanner(KeyValueHeap),变成了这样的调用链路:KeyValueHeap(RegionScanner)->KeyValueHeap(StoreScanner)

->KeyValueScanner,InternalScanner(StoreFileScanner及SegmentScanner)。

为什么HBase要这样封装?

其实是为了抽象不同的功能。

简单来说,

1)StoreScanner是为了联合StoreFileScanner与SegmentScanner向上提供整行的数据迭代读取功能。

2)而RegionScanner,一方面是对获取的数据做了过滤功能,另一方面是为了将全部数据分为两段获取形式(storeHeap和joinedHeap),用以优化性能。因为从storeHeap中获取的数据如果会被过滤,那么就没有必要再获取joinedHeap中的数据了。

详细内容我们见下文。

HBase的读取任务开始之前需要构建初始的Scanner体系,涉及RegionScanner与StoreScanner的对象初始化,我们详细来看:

1)RegionScanner对象的初始化:

1.建立RegionScanner对象,准备开始Scan任务涉及的所有Scanner的生成。

2.根据scan任务涉及的所有column family,在本region上分别会为其中的每个column family生成一个StoreScanner。如果开启了on-demand column family loading,那么会根据传入FilterList的isFamilyEssential方法进行判断,如果isFamilyEssential,那么会将该StoreScanner放入storeHeap中,否则放入joinedHeap中

3.storeHeap和joinedHeap中存放StoreScanner的形式为PriorityQueue,优先级为CellComparatorImp。

2)StoreScanner对象的初始化

接下来我们介绍RegionScanner对象的初始化中,我们一笔带过的StoreScanner的生成过程:

1.根据scan.isReversed()控制StoreScanner中的Scanner的优先级顺序。

2.根据传入的scan信息,生成matcher内置对象,该对象在查询过程中会对StoreScanner读取的数据进行一个筛选。

3.根据scan信息startRow,stopRow在storeEngine中查询出涉及的HStoreFile,对这些HStoreFile分别建立StoreFileScanner,组成scannerList,并且StoreFileComparators.SEQ_ID为优先级(maxSequenceId升序,FileSize降序,BulkTime升序,PathName升序)。

4.对scannerList根据timestamp range, row key range, bloomFilter做一个过滤

5.scannerList中剩余的scanner根据startRow,stopRow将指针seek到正确的位置。

6.将scanners以PriorityQueue的形式组织,优先级同样为CellComparatorImp。

PS:StoreFileComparators.SEQ_ID —— Comparator.comparingLong(HStoreFile::getMaxSequenceId)  .thenComparing(Comparator.comparingLong(new GetFileSize()).reversed())  .thenComparingLong(new GetBulkTime()).thenComparing(new GetPathName())

组建好需要Scanner体系之后,后续就是读取流程了。

读取流程如下图所示:

RegionScanner主要负责以下功能:

其包含storeHeap与joinedHeap都为KeyValueHeap的对象实例,heap底层是包含了多个StoreScanner组成的PriorityQueue,comparator = CellComparatorImp。向上提供符合条件的整行数据的迭代查询。

1.循环从storeHeap上获取cell数据,以此判断是否还存在待获取数据。如果没有,return false。如果有:

2.那么先从storeHeap上获取family essential相关的数据,使用filter进行过滤。如果被过滤,continue loop。如果没有:

3.那么从joinedHeap上获取剩余数据,返回。

StoreScanner主要负责以下功能:

StoreScanner虽然是实现了KeyValueScanner和InternalScanner的类,但主要靠其成员变量heap(KeyValueHeap)来完成必要的操作。heap由多个StoreFileScanner实例按照PriorityQueue组成,comparator = CellComparatorImp。

1.循环从heap中获取cell。

2.通过matcher匹配cell获得返回的MatchCode,不同MatchCode会触发不同的操作,见下表。

 3.不停循环,直到数据组成整行,向上返回。

StoreScanner中KeyValueHeap的next功能:

storeScanner中的heap.next()究竟做了什么?简单来说,做了以下两件事情:1)从current(当前的StoreFileScanner,不在heap中)获取cell返回2)更新当前current,把current放回heap重新排序,再获取当前最优先的StoreFileScanner作为current。

具体做法如下:

1.从当前的StoreFileScanner current中获取下一个cell(kvReturn)。再获取kvReturn往后的第一个cell(kvNext)

2.判断kvNext是否为空。为空代表当前current读取完毕,需要从heap中获取下一个scanner记为current。不为空则

3.从当前heap中获取第一个scanner,与current 进行对比。判断它们谁通过peek()获得的cell key最小,如果scanner更小,那么把current放回heap。重新heap.poll()获得最新current。

4.返回kvReturn cell。

至此整个HBase的读路径分析结束,留待补充的点:

1.Matcher的实现逻辑分析。

2.BloomFilter的过滤分析。

3.StoreFileScanner以下直到HDFS之间的链路分析,中间涉及一个BlockCache。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PolarDB for PostgreSQL 开源路线图

简介&#xff1a;作者&#xff1a;蔡乐 本文主要分享一下Polar DB for PG的开源路线图&#xff0c;虽然路线图已经拟定&#xff0c;但是作为开源产品&#xff0c;所有参与者都能提出修改意见&#xff0c;包括架构核心特性的技术以及周边生态和工具等&#xff0c;希望大家能够踊…

5分钟入门Lindorm SearchIndex

简介&#xff1a;SearchIndex是Lindorm宽表的二级索引&#xff0c;主要用来帮助业务实现快速的检索分析。本篇文章介绍如何通过简单的SQL接口操作SearchIndex。 一、引言 云原生多模数据库Lindorm&#xff0c;支持海量数据的低成本存储和弹性按需付费&#xff0c;提供宽表、时…

最后的 48 小时!云 XR 专题赛邀你一起绽放精彩,我们赛场见!

2022 年是 5G 应用规模化发展的关键之年。随着5G的深入发展&#xff0c;涵盖百亿级“人机物”的智能连接正加速构建&#xff0c;经济社会发展不断向虚实融合演进&#xff0c;基础设施形态也不断向云网融合升级。随着连接对象的拓展和基础设施的升级&#xff0c;XR、元宇宙等新业…

Snowflake核心技术解读系列——架构设计

简介&#xff1a;Snowflake取得了巨大的商业成功&#xff0c;技术是如何支撑起它的千亿美元市值呢&#xff1f;它技术强在哪&#xff1f;本文为大家倾情解读Snowflake的核心技术原理。 背景&#xff1a;2020年9月16日&#xff0c;Snowflake成功IPO&#xff0c;交易首日市场估值…

Apsara Stack 技术百科 | 可运营的行业云,让云上资源跑起来

简介&#xff1a;企业级云管理平台&#xff0c;如何打造千人千面的个性化体验&#xff0c;从应用、云资源、硬件等进行全局智能优化&#xff0c;实现资源配置的最佳配比&#xff0c;构建精细化运营能力&#xff1f; 距离第一例新冠疫情病例的发现&#xff0c;不知不觉中已经过去…

中国数据库崛起,阿里云李飞飞:中国云数据库多种主流技术创新已领先国外

“中国云数据库在很多主流技术创新上已经领先国外。”李飞飞表示&#xff0c;“PolarDB未来还会不断基于新一代云计算架构进行创新突破&#xff0c;持续释放云计算的资源池化潜力&#xff0c;让客户享受到更多云原生技术的红利。” “中国云数据库在很多主流技术创新上已经领先…

十年再出发,Dubbo 3.0 Preview 即将在 3 月发布

简介&#xff1a;随着Dubbo和HSF的整合&#xff0c;我们在整个开源的体系中更多地去展现了 HSF 的能力&#xff0c;能够让更多的人通过使用 Dubbo 像阿里巴巴之前使用 HSF 一样更好的构建服务化的系统。 2011 年&#xff0c;阿里 B2B 团队决定将项目开源&#xff0c;一年时间就…

如何帮助金融客户“用好云”?

简介&#xff1a;如何帮助金融客户“用好云”&#xff1f;做「政企数智创新的同行者」&#xff0c;这对于阿里云混合云来说不仅仅是一句口号&#xff0c;更是在千行百业践行的行动指南。 “我一秒钟几千万上下&#xff0c;会跟你们吃杂碎面&#xff1f;” 这句出自星爷电影台…

nuc8i7beh安装linux随机重启,指南:nuc8i5beh安装黑苹果的教程,接近完美运行

黑苹果采购硬件设施nuc8i5beh镁光m.2 1100 256固态硬盘三星 DDR4 2400笔记本内存条HKC电脑显示器8G U盘(这个之前有&#xff0c;不属于采购的)所需软件Mojave 10.14.6网盘下载Catalina 10.15.2balenaEtcher&#xff1a;下载地址bios65文件&#xff1a;下载地址nuc8 安装软件包&…

低代码、端到端,一小时构建IoT示例场景,声网发布灵隼物联网云平台

2020年&#xff0c;全球 IoT 设备连接数量首次超过非 IoT 设备。市场在高速增长&#xff0c;但音视频物联网的开发门槛依然很高。 6月28日&#xff0c;声网在线上举办主题为“视听无界&#xff0c;智联万物”的产品发布会&#xff0c;正式发布了“灵隼物联网云平台”&#xff0…

云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践

简介&#xff1a;本文主要介绍云知声 Atlas 超算平台基于 Fluid Alluxio 的计算加速实践&#xff0c;以及 Fluid 是如何为 Atlas 带来全新的数据集管理方式的。 Fluid 是云原生基金会 CNCF 下的云原生数据编排和加速项目&#xff0c;由南京大学、阿里云及 Alluxio 社区联合发…

eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术

简介&#xff1a;如何使用 socket eBPF进一步提升Service 网络的转发性能&#xff1f; 背景介绍 Kubernetes 中的网络功能&#xff0c;主要包括 POD 网络&#xff0c;service 网络和网络策略组成。其中 POD 网络和网络策略&#xff0c;都是规定了模型&#xff0c;没有提供默认…

从开店营销到智能化私域运营,有赞发布人工智能引擎Jarvis

“以往在私域发起一场营销活动&#xff0c;从活动策划&#xff0c;到历史数据分析&#xff0c;再到内容排期&#xff0c;整个策划阶段往往需要一周以上的时间&#xff0c;而现在通过营销画布&#xff08;MA&#xff09;以及其中内嵌的人工智能能力&#xff0c;只需要30分钟不到…

“云网管” ---云上构建网络自动化体系

简介&#xff1a;云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理运维平台&#xff0c;提供企业网络全生命周期管理运维的能力&#xff0c;让部署更快捷、运维更高效、网络更透明。 1.背景 云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理…

2022 (第五届)GIS软件技术大会开幕,GIS、IT将加速融合

院士专家共论GIS与AI、数据库等IT技术加速融合趋势。 会上&#xff0c;超图正式发布新产品SuperMap GIS 11i(2022)、与华为联合发布禹贡开源空间数据库。 6月29日上午&#xff0c;2022(第五届)GIS软件技术大会主题大会在线开幕。大会以“地理智慧 多维筑基”为主题&#xff0c;…

构建制品不一致,后续工作都是白费 | 研发效能提升36计

简介&#xff1a;本篇文章&#xff0c;我们从软件交付的终态出发&#xff0c;提出了不可变构建的概念。在软件开发的过程中&#xff0c;我们怎样才能享受产业生态的红利&#xff0c;实现软件交付过程的标准化呢&#xff1f;软件交付当中的集装箱应该是什么样的&#xff1f; 专栏…

巧用 Bitmap 实现亿级海量数据统计

作者 | 码哥字节来源 | 码哥字节在移动应用的业务场景中&#xff0c;我们需要保存这样的信息&#xff1a;一个 key 关联了一个数据集合。常见的场景如下&#xff1a;给一个 userId &#xff0c;判断用户登陆状态&#xff1b;显示用户某个月的签到次数和首次签到时间&#xff1b…

cache 访问延迟背后的计算机原理

简介&#xff1a;本文介绍如何测试多级 cache 的访存延迟&#xff0c;以及背后蕴含的计算机原理。 CPU 的 cache 往往是分多级的金字塔模型&#xff0c;L1 最靠近 CPU&#xff0c;访问延迟最小&#xff0c;但 cache 的容量也最小。本文介绍如何测试多级 cache 的访存延迟&…

创新推出 | Serverless 场景排查问题利器:函数实例命令行操作

简介&#xff1a; 实例命令行功能的推出希望能消除用户使用 Serverless 的“最后一公里”&#xff0c;直接将真实的函数运行环境展现给用户&#xff0c;此后 Serverless 将不再是一个“黑盒”&#xff0c;用户可以更加信任和依赖 Serverless 平台来扩展更多的业务场景和规模。 …

人人都是 Serverless 架构师 | 弹幕应用开发实战

简介&#xff1a;如何使用 Serverless 架构实现全双工通信的应用&#xff0c;Serverless 架构中数据库是如何使用的&#xff0c;本篇文章将为您揭开答。 作者 | 寒斜&#xff08;阿里云云原生中间件前端负责人&#xff09; Serverless 的理念是即时弹性&#xff0c;用完即走。…