hbase存取速度为啥快---第二弹

coeus-p coeus-p     2022-12-08     797

关键词:

版权声明:本文为CSDN博主「九品下」的原创文章 原文链接:https://blog.csdn.net/w892824196/article/

HBase能提供实时计算服务主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree) + HTable(region分区) + Cache决定——客户端可以直接定位到要查数据所在的HRegion server服务器,然后直接在服务器的一个region上查找要匹配的数据,并且这些数据部分是经过cache缓存的。

前面说过HBase会将数据保存到内存中,在内存中的数据是有序的,如果内存空间满了,会刷写到HFile中,而在HFile中保存的内容也是有序的。当数据写入HFile后,内存中的数据会被丢弃。

HFile文件为磁盘顺序读取做了优化,按页存储。下图展示了在内存中多个块存储并归并到磁盘的过程,合并写入会产生新的结果块,最终多个块被合并为更大块。

多次刷写后会产生很多小文件,后台线程会合并小文件组成大文件,这样磁盘查找会限制在少数几个数据存储文件中。HBase的写入速度快是因为它其实并不是真的立即写入文件中,而是先写入内存,随后异步刷入HFile。所以在客户端看来,写入速度很快。另外,写入时候将随机写入转换成顺序写,数据写入速度也很稳定。

而读取速度快是因为它使用了LSM树型结构,而不是B或B+树。磁盘的顺序读取速度很快,但是相比而言,寻找磁道的速度就要慢很多。HBase的存储结构导致它需要磁盘寻道时间在可预测范围内,并且读取与所要查询的rowkey连续的任意数量的记录都不会引发额外的寻道开销。比如有5个存储文件,那么最多需要5次磁盘寻道就可以。而关系型数据库,即使有索引,也无法确定磁盘寻道次数。而且,HBase读取首先会在缓存(BlockCache)中查找,它采用了LRU(最近最少使用算法),如果缓存中没找到,会从内存中的MemStore中查找,只有这两个地方都找不到时,才会加载HFile中的内容,而上文也提到了读取HFile速度也会很快,因为节省了寻道开销。

举例:

A:如果快速查询(从磁盘读数据),hbase是根据rowkey查询的,只要能快速的定位rowkey,??就能实现快速的查询,主要是以下因素:
?????1、hbase是可划分成多个region,你可以简单的理解为关系型数据库的多个分区。
??????2、键是排好序了的
??????3、按列存储的

首先,能快速找到行所在的region(分区),假设表有10亿条记录,占空间1TB,???分列成了500个region,??1个region占2个G.?最多读取2G的记录,就能找到对应记录;

其次,是按列存储的,其实是列族,假设分为3个列族,每个列族就是666M,?如果要查询的东西在其中1个列族上,1个列族包含1个或者多个HStoreFile,假设一个HStoreFile是128M,?该列族包含5个HStoreFile在磁盘上.?剩下的在内存中。

再次,是排好序了的,你要的记录有可能在最前面,也有可能在最后面,假设在中间,我们只需遍历2.5个HStoreFile共300M

最后,每个HStoreFile(HFile的封装),是以键值对(key-value)方式存储,只要遍历一个个数据块中的key的位置,并判断符合条件可以了。?一般key是有限的长度,假设跟value是1:19(忽略HFile上其它块),最终只需要15M就可获取的对应的记录,按照磁盘的访问100M/S,只需0.15秒。?加上块缓存机制(LRU原则),会取得更高的效率。

B:实时查询
???????实时查询,可以认为是从内存中查询,一般响应时间在1秒内。HBase的机制是数据先写入到内存中,当数据量达到一定的量(如128M),再写入磁盘中,?在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase?I/O的高性能。

实时查询,即反应根据当前时间的数据,可以认为这些数据始终是在内存的,保证了数据的实时响应。





写入 Linux 管道的速度比文件快,但在内核级别,为啥?

】写入Linux管道的速度比文件快,但在内核级别,为啥?【英文标题】:WritingtoLinuxpipefasterthanfile,butonakernellevel,why?写入Linux管道的速度比文件快,但在内核级别,为什么?【发布时间】:2020-12-3112:35:00【问题描述】:我正在研究... 查看详情

为啥这个 Jinja2 模板的渲染速度不比 Django 快?

】为啥这个Jinja2模板的渲染速度不比Django快?【英文标题】:Whyisn\'tthisJinja2templaterenderingfasterthanDjangos?为什么这个Jinja2模板的渲染速度不比Django快?【发布时间】:2012-01-0906:41:43【问题描述】:我很想知道Jinja2(2.6)比普通的Django(... 查看详情

为啥在这段代码中 CPU 运行速度比 GPU 快?

】为啥在这段代码中CPU运行速度比GPU快?【英文标题】:WhydoesCPUrunfasterthanGPUinthiscode?为什么在这段代码中CPU运行速度比GPU快?【发布时间】:2022-01-1914:52:13【问题描述】:我正在尝试使用gpuArray来加快我的计算速度。但是,下面... 查看详情

Google Colab 运行速度比 Jupyterlab 快,Google Colab 为啥以及如何运行?

】GoogleColab运行速度比Jupyterlab快,GoogleColab为啥以及如何运行?【英文标题】:GoogleColabisntrunningfasterthanJupyterLab,WhyandHowdoesGoogleColabfunction?GoogleColab运行速度比Jupyterlab快,GoogleColab为什么以及如何运行?【发布时间】:2021-11-0407:22:... 查看详情

在我的情况下,为啥 rds 的执行速度比 redshift 快?

】在我的情况下,为啥rds的执行速度比redshift快?【英文标题】:Whyisrdsperformingfasterthanredshiftinmycase?在我的情况下,为什么rds的执行速度比redshift快?【发布时间】:2018-11-0210:46:25【问题描述】:我有一个RDS实例:db.t2.xlarge(4个v... 查看详情

hbase么,为啥存储速度快

1,了解hbase么,为什么存储速度快?2理解spring么,它的AOP实现是基于什么原理,bean的初始化过程是那些(涉及具体的源代码),在beanfactory初始化前,运行中,初始化后想做些事情。该怎么做?3struts1和strus2的区别,strust2关于ThredL... 查看详情

为啥实体框架在直接选择语句中的执行速度比 Dapper 快 [关闭]

】为啥实体框架在直接选择语句中的执行速度比Dapper快[关闭]【英文标题】:WhyEntityFrameworkperformsfasterthanDapperindirectselectstatement[closed]为什么实体框架在直接选择语句中的执行速度比Dapper快[关闭]【发布时间】:2017-04-2310:06:56【问... 查看详情

eigen的速度为啥这么快

...量化SSE指令市面上Eigen库最快,对于Armadillo+数学库的组合速度取决于数学库的速度,Armadillo本身数学库就不用提了。参考技术A总结来说Eigen做了这么几件事:1.不用中间变量2.小矩阵和大矩阵根据实际情况选用3.特殊的赋值处理4.... 查看详情

为啥n个线程的平均速度不如C中的单个线程快?

】为啥n个线程的平均速度不如C中的单个线程快?【英文标题】:WhytheaveragespeedofnthreadsisnotasfastasonesinglethreadinC?为什么n个线程的平均速度不如C中的单个线程快?【发布时间】:2016-06-2521:54:02【问题描述】:我编写了一个有2个线... 查看详情

pythion第二弹

################################第二节################################################python中数据类型的常见的方法第一个数据类型字符串str字符串里面有很多的功能,叫方法.只要是字符串,就可以用里面的方法,方法有很多,不用刻意的去记住,因为... 查看详情

深入理解threadpoolexecutor第二弹(代码片段)

从源头解析ThreadPoolExecutor第二弹—ThreadPoolExecutor的内部类ThreadPoolExecutor主要包括如下内部类:其中AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy表示任务的拒绝策略,当线程池的线程数量达到最大值并且阻塞队列已... 查看详情

为啥我的collectionView中的单元格的形成速度比接收数据的方法快,因为它们的形成?

】为啥我的collectionView中的单元格的形成速度比接收数据的方法快,因为它们的形成?【英文标题】:WhyMycellsincollectionViewareformedfasterthanthemethodofreceivingdata,fortheirformation?为什么我的collectionView中的单元格的形成速度比接收数据的... 查看详情

web前端-----第二弹css

CSS语法CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。‘‘‘selector{property:value;property:value;...property:value}‘‘‘例如:h1{color:red;font-size:14px;}    css的四种引入方式 1.行内式       ... 查看详情

表单练习第二弹

---恢复内容开始---<bodytext="#33FF00"bgcolor="#33FF33"background="150358666450342800_a580xH.jpg">body里面加属性,字体颜色、背景色、背景图片。在body里面输入的属性是针对在body里面所有内容的属性。<formaction="../10.9表单/www.baidu.html"method=" 查看详情

线段树+rmq问题第二弹

   线段树+RMQ问题第二弹  上篇文章讲到了基于SparseTable解决RMQ问题,不知道大家还有没有印象,今天我们会从线段树的方法对RMQ问题再一次讨论。正式介绍今天解决RMQ问题的方法之前,我先对RMQ问题的概念再... 查看详情

lca问题第二弹

LCA问题第二弹 上次用二分的方法给大家分享了对LCA问题的处理,各位应该还能回忆起来上次的方法是由子节点向根节点(自下而上)的处理,平时我们遇到的很多问题都是正向思维处理困难而逆向思维处理比较容易,LCA问题... 查看详情

查询与查询 - 为啥这个比另一个快?

】查询与查询-为啥这个比另一个快?【英文标题】:Queryvsquery-whyisthisonequickerthantheother?查询与查询-为什么这个比另一个快?【发布时间】:2011-04-0714:24:59【问题描述】:我有以下两个疑问-原来是第一个,第二个是我的轻微“升... 查看详情

dom事件第二弹(uievent事件)

此文章主要总结UIEvent相关的事件,如有不对的地方,欢迎指正。一、uitls.js(绑定事件公共类)varfixs={‘focusin‘:{standard:‘focus‘,ie:‘focusin‘},‘focusout‘:{standard:‘blur‘,ie:‘foucsout‘},‘input‘:{standard:‘input‘,ie:‘propertychange‘}}v... 查看详情