HBase学习笔记-入门(3)-HBase数据模型
HBase数据模型
HBase中不支持关系型模型,而是根据用户的需求提供更加灵活和可扩展的表设计。在HBase中,同样存在表、行、列、单元格等概念,不同的是,HBase中有列族的概念。一个列族包括一列或者多列,并且HBase中的每个列都必须属于一个列族。
可以将HBase的数据模型理解成一个多个维度的Map结构。一张HBase表中存在若干行,并且一张表拥有多个列族,一个列族中存在多个列。根据行键我们可以唯一地定位到一行,在一行中,根据列族+列标识符又可以唯一定位到一列,即得到一个单元格。(可以将行键理解为一级key,列族+列标识符理解成二级key)
表(Table)
HBase中的数据以表的形式存储,同一张表中的数据通常是相关的。一张表拥有多个列族,并且一张表由多个行组成。
行(Row)
HBase中的一行由行键Row Key完全标识,一行内可以拥有多个列族,一个列族拥有多个列。通过列族+列标识符可以定位到行内的某一个值的内容。
行在存储的时候,会按照行键字典顺序进行排序。
列族(Column Family)
HBase中的列族是一些列的集合。一个列族拥有的列不需要事先定义,列族支持动态扩展,用户可以很轻松地添加一个列,无须预定义列的数量以及类型(也无法定义类型)。所有的列均以字符串的形式存储,在用户使用的时候按照需要自行进行数据类型转换
列标识符(Column Qualifier)
列族中的数据通过列标识符来进行定位,列标识符没有特定的数据类型,按照byte [ ]来进行存储。
拥有了列族和列标识符之后,就可以按照Column Family Name:Column Qualifier
格式来定位某一列,例如C1:USER
。
单元格(Cell)
通过行键、列族、列标识符,我们可以定位到一个单元格,单元格中的内容以二进制存储,其中保存同一份数据的多个版本。每个版本记录了一个值和一个时间戳,用来标识版本的先后,最新的数据排列在最前面。
时间戳(Timestamp)
在默认情况下,每一个单元格插入数据时都会用时间戳来进行版本标识。读取单元格数据时,如果时间戳没有被指定,则默认返回最新的数据;写入新的单元格数据时,如果没有设置时间戳,默认使用当前时间。每一个列族的单元数据的版本数量都被 HBase 单独维护,默认情况下 HBase 保留 3 个版本数据。
命名空间(NameSpace)
命名空间,类似于关系型数据库中的DataBase概念。每个命名空间下有多个表,HBase有两个自带的命名空间,分别是hbase和default。其中hbase下存放的是HBase内置的表,包括meta和namespace等;而default是用户默认使用的命名空间。
对比来说,HBase表与关系型数据库中的表结构看起来没有太大差异,只是HBase中多了列族的概念,但是实际上差别还是挺大的。
在关系型数据库中,表的结构需要预先定义,包括列名,数据类型,值域等。如果需要添加新的列,需要修改表结构,而这对已经存在的数据会造成很大影响,并且关系型数据库中对每个列都预留了存储空间,如果新增一个列的话,会导致关系型数据库中产生很多Null
值,消耗大量的存储空间。同时关系型数据库按照行来存储。
而在HBase中,Null
在物理上不占用存储空间。并且如果要添加新列的话,只需要在列族中动态添加即可。另一方面,HBase面向列存储,在实际的物理存储中,列族是分开存储的。