通过了解Hbase的基础概念、架构特点,底层原理等,可以了解HBase读写的特点。通过从底层理解这些特点,我们能够将HBase应用到合适的场景。
本文主要了解HBase的:
- hbase的概念、架构
- hbase的特点细节:存储拓展性、列存储、定义数据版本、查询快吗
- 应用场景、生产注意事项。
Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
Apache HBase 是 Hadoop 数据库,一个分布式、可伸缩的大数据存储。HBase是一个NoSQL数据库,它把数据存在HDFS上。
HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
HBase特点:
- 存储数据的”结构“可以地非常灵活。
- HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过 hive
支持来实现多表 join等复杂操作),主要用来存储结构化和半结构化的松散数据。- Hbase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
一. HBase 数据模型
1. 行存储与列式存储
1.1. 行存储
行存储系统以行的方式来组织数据。行存储将数据一行一行的写入,写入一条数据记录时,只需要将数据追加到已有数据记录后面即可。
![]()
行模式存储适合 OLTP(Online Transaction Processing)系统。因为数据基于行存储,所以数据的写入会更快。对按记录查询数据也更简单。
场景:统计整个系统今天的博客点赞数。对于行存储系统,需要将所有行数据读入内存,然后对 like_num 列做 sum 操作,从而得到结果。

我们假设磁盘一次可以读取图中 3 个方框的数据,那么这个聚合计算需要 N(N/3=数据量)次磁盘访问。
1.2. 列存储
同样是上面的示例数据,我们来看列式存储是怎样组织数据的。

列式存储将每一列的数据组织在一起。
利于对于列的操作,如上面我们说到的统计所有 like_num 之和。其过程将如下:

依然假设磁盘一次可以读取 3 个方框的数据(实际按 byte 读取)。可以看出按列存储组织数据的方式,只需要 1 次磁盘操作就可以完成。
列式存储也有不利的一面。首先就表现在数据写入上。

HBASE是怎么存储的?我们下面讨论。
对比:

2. HBase 数据模型
2.1. 模型概览
| 概念 | 解释 |
|---|---|
| Name Space | 1. 命名空间,类似于关系型数据库的 DataBase 概念,每个命名空间下有多个表。 2. HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。 |
| Region | 1. 类似于关系型数据库的表概念。 2. 不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。 |
| Row | 1. HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成。 2. 数据是按照 RowKey的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要(热点数据,同类数据下的实时需求)。 |
| rowKey | rowKey又叫行键,它是有序的(字典顺序) |
| Column | 1. HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。 2. 建表时,只需指明列族,而列限定符无需预先定义。 |
| Time Stamp | 用于标识数据的不同版本,每条数据写入(新增、更新、删除等操作都是写入)时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。 |
| Cell | 由{rowkey, column Family:column Qualifier, time Stamp} 确定一条数据的单元。 |
接下来重点讲解几个和关系型数据库不同的概念。
2.2. 列与列族
HBase的列不是我们在关系型数据库所想象中的列。
HBase的列(Column)都得归属到列族(Column Family)中。在HBase中用列修饰符(Column Qualifier)来标识每个列。在HBase里,先有列族,后有列。
什么是列族?可以简单理解为:列的属性类别
什么是列修饰符?在列族下用列修饰符来标识一列。
看一个的例子:

HBase表的每一行中,列的组成都是灵活的,行与行之间的列不需要相同。换句话说:一个列族下可以任意添加列,不受任何限制。

2.3. 时间戳:定义数据版本
数据写到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。比如说,我们修改或者删除某一条的时候,本质上是往里边新增一条数据,新增了记录的版本。

- 比如现在修改phone的值,实际上就是多添加一条记录,在读的时候按照时间戳读最新的记录。在外界「看起来」就是把这条记录改了。
- 删除一条数据实际上也是增加一条记录,只不过我们在KeyType里边设置为“Delete”就可以了。
2.4. HBase的Key-Value
HBase本质上其实就是Key-Value的数据库,那在HBase里边,Key是什么?Value是什么?

每个KeyValue都由4个部分构成,分别为key length,value length,key和value。其中
- key length和value length是两个固定长度的数值
- key是一个复杂的结构,
rowkey长度、rowkey
ColumnFamily长度、ColumnFamily、ColumnQualifier
时间戳
KeyType(keytype有四种类型,分别是Put、Delete、 DeleteColumn和DeleteFamily)
- value就是一串纯粹的二进制数据。
要准确定位一条数据,那就需要知道:RowKey+Column+时间戳。

本文介绍了HBase数据库,包括其数据模型,如行存储与列式存储;架构,含读写流程、HRegionServer内部和HMaster;特性,如大数据存储拓展、查询速度等;适合的业务场景,如写密集型应用、搜索引擎等;以及在生产环境使用前的注意事项,如查询条件、rowkey设计等。
最低0.47元/天 解锁文章
3689

被折叠的 条评论
为什么被折叠?



