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 => '', VERSIONS => }]

:表的名称,需要是引号括起来的字符串。

, :列族名称,也需要是引号括起来的字符串。列族是 HBase 表的基本存储单元。

{NAME => '', VERSIONS => }:可选的属性,用于指定列族的配置参数。例如,VERSIONS 指定存储的版本数。

如下图所示,Table表中的每行(Row)数据都由一个行键(RowKey) 和一个或多个列族(Column family)组成、 1个列族(Column family)又包含一个或多个Column(列)。

Rowkey(行键)

Hbase数据物理上是按照RowKey(行键)的字典顺序存储的,并且查询数据时只能根据 RowKey进行检索,所以 RowKey 的设计十分重要。例子:

要按订单id查询,就得将订单id设置为RowKey。

@WebServlet注解(Servlet注解)
qq黄钻有什么用?QQ钻颜色大全 及相应的会员权益