vlambda博客
学习文章列表

「大数据」(三十九)HBase之数据模型及表结构设计

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[39]篇文章,欢迎阅读和收藏】

基本概念

Hbase 是列式存储数据库,数据模型元素包括:表、行、列、列簇、列标识、单元及时间戳。以列为单位聚合数据,然后将列值顺序地存入磁盘,这种存储方法不同于行式存储的传统数据库。

行和列存储方式对比:


行式存储

列式存储

优点

数据被保存在一起

INSERT/UPDATE 容易

查询时只有涉及到的列会被读取

投影 (projection) 很高效

任何列都能作为索引

缺点

选择 (Selection) 时即使只涉及某几列,所有数据也都会被读取

选择完成时,被选择的列要重新组装

INSERT/UPDATE 比较麻烦


术语解释

表 (Table): HBase 会将数据组织进一张张的表里面,但是需要注意的是表名必须是能用在文件路径里的合法名字,因为 HBase 的表是映射成 hdfs 上面的文件。

行 (Row): 在表里面,每一行代表着一个数据对象,每一行都是以一个行键( Row Key )来进行唯一标识的,行键并没有什么特定的数据类型,以二进制的字节来存储。

列族 (Column Family): 在定义 HBase 表的时候需要提前设置好列族 , 表中所有的列都需要组织在列族里面,列族一旦确定后,就不能轻易修改,因为它会影响到 HBase 真实的物理存储结构。

列标识 (Column Qualifier): 列族中的数据通过列标识来进行映射,其实这里大家可以不用拘泥于“列”这个概念,也可以理解为一个键值对 ,Column Qualifier 就是 Key 。列标识也没有特定的数据类型,以二进制字节来存储。

单元 (Cell): 每一个行键,列族和列标识共同组成一个单元,存储在单元里的数据称为单元数据,单元和单元数据也没有特定的数据类型,以二进制字节来存储。

时间戳 (Timestamp): 默认下每一个单元中的数据插入时都会用时间戳来进行版本标识。读取单元数据时,如果时间戳没有被指定,则默认返回最新的数据,写入新的单元数据时,如果没有设置时间戳,默认使用当前时间。每一个列族的单元数据的版本数量都被 HBase 单独维护,默认情况下 HBase 保留 3 个版本数据。


3 设计要点

设计 HBase 中的表的时候需要考虑以下的几个问题:

1. Row Key 的结构该如何设置,而 Row Key 中又该包含什么样的信息

2. 表中应该有多少的列族

3. 列族中应该存储什么样的数据

4. 每个列族中存储多少列数据

5. 列的名字分别是什么,因为操作 API 的时候需要这些信息

6. 单元中 (cell) 应该存储什么样的信息

7. 每个单元中存储多少个版本信息

在 HBase 表设计中最重要的就是定义 Row-Key 的结构,要定义 Row-Key 的结构时就不得不考虑表的接入样本,也就是在真真实应用中会对这张表出现什么样的读写场景。除此之外,在设计表的时候我们也应该要考虑 HBase 数据库的一些特性:

1. HBase 中表的索引是通过 Key 来实现的

2. 在表中是通过 Row Key 的字典序来对一行行的数据来进行排序的,表中每一块区域的划分都是通过开始 Row Key 和结束 Row Key 来决定的。

3. 所有存储在 HBase 表中的数据都是二进制的字节,并没有数据类型。

4. 原子性只在行内保证, HBase 表中并没有多行事务。

5. 列族 (Column Family) 在表创建之前就要定义好

6. 列族中的列标识 (Column Qualifier) 可以在表创建完以后动态插入数据时添加。