因为Hbase属于NoSQL,非关系型数据库,所以会经常拿来和关系型数据库做对比。面试的时候也会问到为何Hbase的速度快或者为什么选择Hbase作为数据库存储。下面的文章是转发的,对于上述问题的回答有一定的参考意义。仅供参考。

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的高性能。

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

Hbase查询速度快的原理分析相关推荐

  1. HBase架构设计及原理分析

    我们从以上架构图可以得知HBase存储机制涉及到的组件: 一 ZooKeeper作用: #存储HBase元数据 #负责HMaster的选择和主备切换 #负责对HRegionServer进行监控:HRe ...

  2. 为什么MyISAM会比Innodb的查询速度快。 btree 和 lsm(hbase) ,cola 树(tokuDB)选型和原理

    父文章 如何成为一名架构师,架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客_架构师成长之路 相关文章 1.8 leveldb vs rocksdb 优劣分析 对 write stalli ...

  3. 搞懂 SQL 查询优化原理分析,秒速处理大数据量查询

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到 ...

  4. PageHelper 关闭COUNT(0)查询 以及PageHelper 的分页原理分析

    pagehelper 关闭count(0)查询 以及pagehelper的分页原理分析 情景再现:在给移动端提供分页查询数据接口时,知道他们不需要总条数.但是使用pagehelper 分页查询打印的s ...

  5. html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析

    在 上一篇 Golang Gin 实战(三)| 路由参数 文章中,主要介绍了路由通配符.路由参数,让我们有了一种可以从URL路径中获取参数的方式,同时又不是重复的注册相似的路由. 这一篇,主要介绍查询 ...

  6. 大数据技术——Flume原理分析

    摘要 主要是分析和讲解Flum的原理源码分析 Flume概述 Flume是的一个分布式.高可用.高可靠的海量日志采集.聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据,同时提供了对数 ...

  7. 一个HBase查询问题引发的思考,作为HBase使用者这个问题你知道答案吗?

    前言 讲解HBase事务的文章很多,这里就不过多赘述了,大家应该都知道是通过MVCC实现的.但是今天这篇文章的背景是一个同事和我讨论一个问题引发的,这个问题使我重新梳理下这块内容并作为记录和大家分享. ...

  8. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

  9. EJB调用原理分析 (飞茂EJB)

    EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...

最新文章

  1. redis系列(一)-----日常使用详解
  2. FFT IP核调用与仿真之FFT数学分析
  3. E - 秋实大哥与战争
  4. vue 高德地图多边形_Vue + 高德地图画矢量图
  5. Java 集合框架看这一篇就够了
  6. caffe 测试时间报错 Aborted at unix time
  7. 计算机组成与维修考试试题,期末考试试题计算机组成与维修.doc
  8. java多线程之hashmap concurrenthashmap的状态同步
  9. oracle备份和还原
  10. python3 x和python2 x区别_Python知识:Python 3.x和2.x版本的使用区别
  11. Nice,涨薪近40%
  12. 洛谷 P1080 国王游戏
  13. php日期数组,关于php日期数组的用法汇总
  14. 总结之:CentOS 6.5 LAMP分主机平台的搭建及测试
  15. Spark Tungsten揭秘 Day3 内存分配和管理内幕
  16. linux 卸载 resin,卸载软件 - OpenRASP 官方文档 - 开源自适应安全产品
  17. mysql编译方式查询_源码编译mysql及其各种查询总结
  18. UNIX SIGTERM等信号意义
  19. JDBC-使用Statement操作数据库的弊端
  20. 微信公众平台搭建与开发揭秘

热门文章

  1. 数据对齐-编辑距离算法详解(Levenshtein distance)
  2. ACM省赛海岛争霸(Dijkstra和DFS两种方法)
  3. 不考虑安全的数字化转型都是伪命题
  4. Mac系统重装指南(不抹盘):2023版保姆级教程,轻松解决macOS问题并保留数据和软件
  5. eclipse设置字体大小以及更改快捷键
  6. Sentinel 原理:调用链
  7. 空气中的声压级、声功率级、声强级的区别
  8. 微软经常会在某影片上映之前选取其海报或影片截图
  9. SpringCloud学习一(微服务远程调用案例:入门)
  10. C#实现离散数学中Kn图一笔画模拟