0%

HBase 数据模型

HBase 数据模型


前言

HBase表主要包含 namespace(命名空间)、tableName(表名)、rowKey(主键)、column Family(列簇)、column qualifier(列)、cell(值)、timeStamp(时间戳)

Namespace

表命名空间,将多个表分到一个组进行统一管理。相当于 MySQL 里的 database

表命名空间主要是用来对表分组,那么对表分组有什么用?
命名空间可以填补 HBase 无法在一个实例上分库的缺憾,通过命名空间我们可以像关系型数据库一样将表分组,对于不同的组进行不同的环境设定,比如配额管理、安全管理等。

HBase 中有两个保留表空间是预先定义好的

  • hbase: 系统表空间,用于组织 HBase 内部表;
  • default: 那些没有定义表空间的表都被自动分配到这个表空间下。

Table

下图是一张 HBase 的表,概括了列族、列名和行之间的关系

术语统一:

一行由很多列组成,全部由相同的主键引用。一个特定的主键和特定的列蔟:列称为单元格。一个单元格可以有很多版本,由不同时间戳的版本来区分。单元格可以叫做键值对

因此,一行由一个键引用,每行由一组单元格组成,其中每一个单元格又由特定的主键和列名确定

表名,列蔟是需要建表时给出,列可以在插入时指定加入,动态生成。一个列蔟可以有多个列。

因为表名和列簇将在文件系统中被用于创建文件和目录,表名称和列簇名称需要使用可以打印的字符,此限制不适用与列。

Row

一个行包含了多个列,这些列通过列族来分类

行中的数据所属列族只能从该表所定义的列族中选取

由于 HBase 是一个列式数据库,所以一个行中的数据可以分布在不同的服务器上。

HBase支持单行事务,行的一次读写是原子操作 (不论一次读写多少列),这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。

Row Key

行键,Table的主键,用来检索记录。访问HBase table中的行,只有三种方式:
通过单个row key访问
通过row key的range
全表扫描

row key可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes左右),
在HBase内部,row key保存为字节数组。

数据按照row key的字典序(byte order)排序存储,因此设计key时要充分排序存储这个特性,
将经常一起读取的行存储放到一起。
为了加快查询,键和列会按照字典排序存储在表中。

RowKey 数字如果想保持数字顺序可以存储它们的字节表示

Column Family

列簇,Table在水平方向有一个或者多个Column Family组成。

列族是多个列的集合。HBase 会尽量把同一个列族的列放到同一个服务器上,
这样可以提高存取性能,并且可以批量管理有关联的一堆列

所有的数据属性都是定义在列族上

在 HBase 中,建表定义的不是列,而是列族

Column Qualifier

列族和列经常用 Column Family: Column Qualifier 来一起表示,列是可以随意定义的,一个行中的列不限名字、不限数量。

所有 Column Qualifier 均以二进制格式存储,用户需要自行进行类型转换。

Timestamp

时间戳,每次数据操作对应的时间戳,可以看作是数据的version number。

时间戳的类型是 64位整型,用长整型long表示。

时间戳可以由HBase在数据写入时自动赋值,此时时间戳是精确到毫秒的当前系统时间;

时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

为了避免数据存在过多版本造成的的管理 (包括存储和索引)负担,

HBase提供了两种数据版本回收方式:
一是保存数据的最后n个版本
二是TTL,即为保存最近一段时间内的版本(比如最近七天)
用户可以针对每个列族进行设置。

Cell

hbase面向列存储的。这意味着每一列都是单独存储的,而不是单独存储整个行。只有带有值的列才会存储,没有值的列将不会存储。

由 {row key, column family, column qualifier, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。

总结

HBase 所有数据都是以字节的方式存储的。


参考链接