前言:在关系型数据库中,数据是按行、列排列的。通过行号、列名可以准确定位一个值。当我们查询数据的时候,数据就能以行列表格的形式展现出来。HBase是一种NoSQL数据库,即非关系型数据库。那么,HBase中的数据是什么结构呢?和传统的关系型数据库有什么区别吗? 本篇目标:

  1. 掌握一张HBase表中有哪些组成部分
  2. HBase表各部分之间的关系是怎样的
  3. 了解HBase底层存储数据的物理结构
  4. 掌握几个有关于HBase表的重要概念

01

逻辑结构我们先通过两个模型来学习一张HBase表有哪些内容,这些内容之间的逻辑关系是怎样的。注意,这里重点谈的是

逻辑关系,并不代表实际存储数据的结构就是这样!

一、通过表格视图看逻辑结构

类比关系型数据库,将HBase表中数据放在一张表里,结构如下图所示。


hbase 删表 The procedure 367 is still running hbase删除表中数据_hbase 删除 列


△表格视图 在图中我们看到了行、Row Key、列、列族、列限定符、时间戳、Celll等内容。下面一一进行介绍: 1.     Row-行

一个HBase表由若干行组成,一行由1个Row Key(行键)和一列或多列组成。 

1)Row Key-行键

RowKey相当于传统数据库表中的“

主键”,就是每个数据的行号。插入数据时必须要有Row Key,Row Key是唯一的,如果插入重复Row Key相当于覆盖。

 行在 存储时按行键的字典序进行排序。因此,

Row Key的设计非常重要。  2.     Column-列

HBase中的列由一个

列族和一个

列限定符组成,二者共同决定了一个数据的列名。如行号为

rowkey1,列名为

personal_info : name的数据,值为'

赵'。 

1)Column Family-列族

列族相当于一组列的集合。在创建表时,列族是

必须指定的;一张HBase表一般有1-3个列族。 

2)Column Qualifier-列限定符

列限定符相当于关系型数据库中的列名。在创建表时,列限定符是不必须指定;表创建后,列限定符可以动态增加。HBase中的列可以动态增加,指的就是列限定符可以动态增加。 

3.     Time Stamp-时间戳

写入数据时,每个数据都会加上一个时间戳,默认是数据写入HBase的时间。 注 意: 时间戳是每个值都有的,不是说一行数据对应一个时间戳。 上图中每个格子里的 值都有自己对应的时间戳,我由于做图不便,把其它列中每个值的时间戳省略了。 时间戳的存在,相当于让数据有了不同的版本。新数据覆盖老数据时,不是直接把老数据删掉,而是只显示时间戳更大的那条数据,看起来就像是数据被修改了。 

4.     Cell-单元格

Cell是HBase中的最小存储单位,可以Cell把想象成Excel中的一个单元格。 Cell由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定。 Cell中的数据是没有类型的,全部是字节码类型存储。Cell中也可以没有数据,没有数据时不会占用空间,所以说HBase具有‘稀疏性‘。

二、通过多维Map看逻辑结构

从底层的物理存储结构来看,HBase的表更像是多维Map。把 表格视 图中的数据 转化成 多 维Map 视 图 的形式,那么结构如下:

{ "rowkey1": {          personal_info: {             1610593998 - personal_info : name  : "赵"              1610593999 - personal_info : age    : "18"              1610594000 - personal_info : city    : "上海" }          company_info: {              1610593999 - company_info : phone  : "111111"        1610594000 - company_info : adress  : "中国"  }   }       "rowkey11": {          personal_info: {              1610594001 - personal_info : name  : "钱"              1610594002 - personal_info : age    : "21"              1610594003 - personal_info : city    : "北京"    }          company_info: {              1610593999 - company_info : phone  : "111111"            1610594000 - company_info : adress  : "中国"    }      }}

通过多维map视图我们可以进一步理解几个问题: 

1.行列关系

新增一列(列限定符)并不是所有行都增加了这个列,应该是每行都添加了一个同名的列,构成了逻辑上的一列。  2.列的动态增长在多维Map视图中,增加一列其实就是添加一行列名和之前的列名不同的值。所以说Hbase的列是动态增长的。 

3.Cell

前面提到了Cell这个概念,每个Cell是独立的,增加一个值对别的Cell没有影响。


02

物理结构


了解了HBase的逻辑结构,我们再来看一下,HBase数据的物理存储结构。



hbase 删表 The procedure 367 is still running hbase删除表中数据_限定符_02

△物理结构图

通过物理结构,还要进一步理解几个知识点:


1.数据的版本(Version)注意看物理结构图中的标红部分,这两行数据除了值和时间戳不一样,其它都是一样的。当我们修改数据时,实际上是存了一条新数据,老数据并没有

立即删除。查询的时候,HBase也是返回最新的数据,也就是时间戳更大的那一条。也就是说,HBase通过时间戳给数据数据划分了不同版本,只不过用户感受不到。

2.Type属性Type = 'Put'表示新增数据,Type = 'Delete'表示删除数据。删除数据时,会新增一条Type = 'Delete'的数据,查询时数据不会返回,相当于数据被删除了。


HBase存储数据的文件是HFile格式的,打开后可以看到数据实际是这样的:



hbase 删表 The procedure 367 is still running hbase删除表中数据_hbase 删除 列_03


03

补充几个概念关于HBase的表,还有几个重要概念需要掌握,后面的学习中会反复提到。


hbase 删表 The procedure 367 is still running hbase删除表中数据_时间戳_04

1.Name Space命名空间,相当于关系型数据库的 DatabBase ,每个命名空间下有多个表。用户可以创建、删除新的命名空间。


HBase 有两个自带的命名空间,分别是

hbase

default

hbase 中存放的是 HBase 内置的表;

default 是用户默认使用的命名空间。

2.Region一个Region相当于表的一个切片,根据Row Key进行划分。为什么要划分Region呢?因为数据量大了之后检索一个文件太慢,所以要进行类似于Hive分区的操作,以提升查询效率。不同的Region要存储在不同的节点上。

3.StoreHBase的表根据'

'

可以划分成不同Region,还可以根据'列族'划分成不同的Store。Region一般等数据量大了才会进行划分,而Store一开始就是分开的。

HBase的数据其实是存储在不同的Store中,图中有4个Store,也就是说数据存储在4个不同文件夹中。


总结:

HBase数据模型是入门的第一个难点,大家学习的时候不要纠结到底是哪种结构,重点是掌握各部分的逻辑关系。特别是要理解增/删一条数据时,数据是怎么变化的。

比如修改一条数据时,在逻辑结构中就是修改了一个Cell的值,但在物理结构上是添加了一条新数据。 其次,对于Region、Store这两个概念,一定要好好理解。这两个概念涉及了HBase的核心原理,后面的学习会经常出现。 —  END  —