HBase 是一个NoSQL数据库,用于处理海量数据,可以支持10亿行百万列的大表。

什么时候使用 HBase

HBase作为一款NoSQL数据库,并不能解决所有问题。关于我们在实际生产过程中满足哪些条件的时候可以选择HBase作为底层存储,这里给出几点建议:

1、数据量规模非常庞大

一般而言,单表数据量如果只有百万级或者更少,不是非常建议使用HBase而应该考虑关系型数据库是否能够满足需求;单表数据量超过千万或者十亿百亿的时候,并且伴有较高并发,可以考虑使用HBase。这主要是充分利用分布式存储系统的优势,如果数据量比较小,单个节点就能有效存储的话则其他节点的资源就会存在浪费。

2、要求是实时的点查询

HBase是一个Key-Value数据库,默认对Rowkey即行键做了索引优化,所以即使数据量非常庞大,根据行键的查询效率依然会很高,这使得HBase非常适合根据行键做单条记录的查询。值得说明的是,允许根据行键的一部分做范围查询,这里涉及到Rowkey的设计问题,不再赘言。

3、能够容忍NoSQL短板

前面提及了NoSQL并不能解决所有问题,HBase也是一样,如果业务场景是需要事务支持、复杂的关联查询等,不建议使用HBase。HBase有它适合的业务场景,我们不能苛求它能够帮我们解决所有问题。

4、数据分析需求并不多

虽然说HBase是一个面向列的数据库,但它有别于真正的列式存储系统比如Parquet、Kudu等,再加上自身存储架构的设计,使得HBase并不擅长做数据分析,或者说数据分析是HBase的弱项,所以如果主要的业务需求就是为了做数据分析,比如做报表,那么不建议直接使用HBase。

如果能够满足上诉的几点,硬件条件也满足的情况下,强烈建议考虑使用HBase作为底层存储解决你的问题。

HBase表结构

下面我们以一个用户表为例,表名为user。将name,age,sex等3个列放入第一个列族base_info中,address,role,provice等3个列放入第二个列族ext_info中,第三个列族为timestamp。

整体表结构如下:

HBase数据模型

命名空间

命名空间是对表的逻辑分组,不同的命名空间类似关系数据库的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。

对应关系数据库中的一张表,HBase以”表”为单位组织数据,表由多行组成。

行由一个RowKey和多个列族组成,一个行有一个RowKey,唯一标识。

列族

每一行由若干列族组成,每个列族下可包含多个列,如上面的base_info、ext_info即是两个列族。列族是列共性的一些体现。注意:物理上,同一列族的数据存储在一起的。

列限定符

列由列族和列限定符唯一指定,如上的name、age是base_info列族的列限定符。

单元格

单元格由RowKey、列族、列限定符唯一确定,单元格存放一个值(Value)和一个版本号。

时间戳

单元格内不同版本的值按时间倒序排列,最新的数据排在最前面。

HBase特点

1)海量存储

HBase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与HBase的极易扩展性息息相关。正是因为HBase良好的扩展性,才为海量数据的存储提供了便利。

2)列式存储

这里所说的列式存储是列族存储,HBase是根据列族来存储数据的。列族下面可以由非常多的列,列族在创建表的时候就必须指定。

3)极易扩展

HBase扩展性主要提现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。

通过横向添加ReginServer的机器,进行水平扩展,提升HBase上层的处理能力,提升HBase服务更多的Region的能力。

4)高并发

由于目前大部分使用HBase的架构,都是采用的廉价的PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,HBase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。

5)稀疏

稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,不会占用存储空间。

发表评论

电子邮件地址不会被公开。 必填项已用*标注