用 HBase 做高性能键值查询?

简介:

最近碰到几家用户在使用 HBase 或者试图使用 HBase 来做高性能查询,场景也比较类似,就是从几十亿甚至上百亿记录中按键值找出相关记录来。按说,这种 key-value 式的数据库很适合用键值查询,HBase 看起来就是个不错的选择。

然而,已经实施过的用户却反映:效果非常差!

其实,这是预料之中的结果,因为 HBase 根本不适合做这件事!

从实现原理上看,key-value 式的数据库无非也就是按 key 建了索引来查找。而索引技术,无论是传统数据库用的 B 树还是 NoSQL 数据库常用的 LSM 树,其本质都是利用键值有序,把遍历查找变成二分(或 n- 分)查找,在查找性能上并没有根本差异。LSM 树的优势在于一定程度克服了 B 树在更新时要面对的复杂的平衡调整,并利用了硬件的特点,对于并发高频写入的操作更为擅长,在读取方面却反而有所牺牲。而对于很少更新的历史数据,用 NoSQL 数据库在按键值查找时,和传统关系数据库相比,并不会有优势,大概率还会有劣势。

不过,对于只要找出一条记录的情况,这个优势或劣势是察觉不到的,就算差了 10 倍,也不过是 10 毫秒和 100 毫秒的差别,对前端操作人员来讲都是立即响应。所以,人们一般也不容易有直观的体验。

但是,如果要找出成千上万甚至几十万行记录时,那感觉就明显了,100 毫秒执行 1 万次就要 1000 秒了。上面说的用户应用效果差也是这种情况。

用键值取数时,可以通过索引直接跳到数据所在地,这样硬盘访问量非常小,所以能做到很快。而如果键值非常多时,涉及的数据到处都是,硬盘访问量就会加大很多。而且数据在外存中是按块存储的,你不可能只读取一条记录本身的数据,而要把这个记录周边的数据都读出来,多读出的内容常常比要读的数据量还大很多倍。在总共只取一条记录时,即使这样,用户体验也不会有多差(10 毫秒和 100 毫秒的差异);而要取出很多记录时,这个多读的内容也就跟着翻倍了,用户体验也就很糟糕了。

如果这些键值是连续的,那么适当设计存储,让数据的物理存储也按键值有序,这样就不会有浪费的读取内容,性能损失也就很少。商用关系数据库一般会按插入次序存储数据,基本可以保证这一点。在存储块中会留有一部分空间应付少量改写,这样有些数据改动了也能大体保证连续性,按键值区间查找的性能也还不错。但 HDFS 没有改写能力,HBase 在有数据改写时只能先扔到后面(LSM 树也是这么设计的),这样会导致数据存储的不连续性,增加多余的读取,降低性能。

如果键值不连续(这是更常见的情况),那这种多余读就无论如何不能避免,这时候想再优化的办法就是压缩,直接减少物理存储量。但是在这方面,HBase 这种 key-value 数据库的表现也不如人意。这些 NoSQL 允许同一表中不同记录有不同字段,它不象关系数据库那样对每个表有一个所有记录统一的数据结构定义,这样带来了写入的灵活性,但势必要将数据结构信息附在记录上,导致存储量加大很多,给读取造成巨大的负担。而且,这种 key-value 方式也没法采用列存(严格地说,就没有列的概念),而列存 + 排序后可以极大提升压缩率(这个问题以后可以再专门讲)。HBase 有个列族的概念,可以充当列的作用,这方面问题一定程度会有所缓解,但用起来并不方便。

总结下来,大多数 key-value 数据库是为了高频写入而设计的,而不是为了高速读取! 用来做高性能查询完全是个方向性错误。用于键值查找都不合适,而其它非键值查询的效果就更为恶劣(以前文中也说过这个问题)。

明明不合适,为什么还有这么多人用或想用 HBase 来解决这个问题呢?可能是 Hadoop 名声太大吧,只要有大数据就会想到用 Hadoop。而且,很多传统关系数据库也确实搞不定太大量的数据,数据量大到一定程度,存储都是问题,查询就无从提起了。不过,有些新的数据技术方案已经能够解决这些问题,延续了传统数据仓库的某些技术手段,比如事先确定数据结构、为读而优化的索引、列存及压缩等,再有合理的存储机制以支撑巨大数据量,这样就能得到比 HBase 好得多的性能体验。

作者:279400248
链接:http://c.raqsoft.com.cn/article/1533883748053
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库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
相关文章
|
SQL 存储 分布式数据库
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
【通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据 】
247 0
|
存储 SQL 自然语言处理
基于 HBase 的海量数据查询与检索解析|学习笔记
快速学习基于 HBase 的海量数据查询与检索解析
基于 HBase 的海量数据查询与检索解析|学习笔记
|
11月前
|
缓存 分布式数据库 API
hbase查询速度很慢
hbase查询速度很慢
581 1
|
分布式计算 分布式数据库 Scala
Spark查询Hbase小案例
写作目的 1)正好有些Spark连接HBase的需求,当个笔记本,到时候自己在写的时候,可以看 2)根据rowkey查询其实我还是查询了好久才找到,所以整理了一下 3)好久没发博客了,水一篇
211 0
Spark查询Hbase小案例
|
SQL 缓存 分布式计算
HBase查询一张表的数据条数的方法
HBase查询一张表的数据条数的方法
1017 0
HBase查询一张表的数据条数的方法
|
分布式数据库 Hbase
《基于HBase的海量数据查询与检索解析》电子版地址
基于HBase的海量数据查询与检索解析_游骐_202105_v3
86 0
《基于HBase的海量数据查询与检索解析》电子版地址
|
SQL 物联网 关系型数据库
实时即未来,车联网项目之phoenix on hbase 即席查询【四】
实时即未来,车联网项目之phoenix on hbase 即席查询【四】
212 0
|
2月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
90 4
|
1月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
69 4
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
32 3