Hbase核心原理及优劣分析
2025-09-19 14:32:42
一、Hbase的特点
Apache Hbase是一个基于Hdfs构建的分布式,可扩展的NoSQL数据库。
Hbase一般应用于需要存储海量数据,又不需要复杂多维度查询检索,不频繁更新的场景。例如阿里用来备份存储海量历史订单明细,用户历史数据报表,备份商品信息等。
先讲讲我对Hbase优劣分析的思考,后面在结合原理进一步剖析根本原因。
Hbase优势
分布式数据库,可以存储几10亿行,数百万列数据的巨大table。
非常高效的随机读写性能,单行数据写入、单RowKey读取ms级别,并发可达到几十万qps。比Hive要快很多。
动态列存储,相比于mysql、oracle一类关系数据库,Hbase可以在不锁表的情况下随意增加、去除数据列。
Hbase劣势
需要多维检索存储数据的场景难以胜任。比如用户需从订单号,订单状态,时间范围,商品标题...各种维度搜索订单这类场景。阿里内部早期这类使用Hbase的场景基本都放弃了Hbase转到别的技术架构上了。主要原因有2个:
一条数据写入会放大成若干条不同RowKey数据,造成写入放大,数据一致性保证考验
Hbase查询时。计算节点RegionServer、存储节点Hdfs是分离的,范围查询scan如果路由到多个RegionServer、Hdfs物理机时,因为会有大量网络损耗,导致性能急剧下降。我们在生产使用中Hbase会有很多毛刺就是这个原因。
Hfile中会冗余存储很多RowKey、列簇,字段名称等信息。另外当存储的数据频繁更新时,使用不当会存在大量历史版本数据冗余。导致Hbase存储成本会比较高。
不支持关系数据库中的事务功能。
Hbase访问数据API相比关系数据库SQL灵活性太差了。虽然可以在Hbase上集成一层Phoenix、Hive支持,但这样操作会以损失高效查询访问性能为代价。
客户端链接创建时要读取大量集群meta信息很慢。
二、Hbase数据模型&概念
Name Space命名空间
类似于关系数据库的 DatabBase 概念,每个命名空间下有多个表。
Table表
和关系数据库表类似。不过Hbase创建表时只需要指定列族Column family即可,无需指定具体字段,字段可以动态添加。
另外Hbase更新数据时是通过增加版本号来实现,不改历史数据,所以创建表时可以指定保存历史版本数量。
建表语句:
create '
{NAME => '
如下图所示,Table表中的每行(Row)数据都由一个行键(RowKey) 和一个或多个列族(Column family)组成、 1个列族(Column family)又包含一个或多个Column(列)。
Rowkey(行键)
Hbase数据物理上是按照RowKey(行键)的字典顺序存储的,并且查询数据时只能根据 RowKey进行检索,所以 RowKey 的设计十分重要。例子:
要按订单id查询,就得将订单id设置为RowKey。