前言:在关系型数据库中,数据是按行、列排列的。通过行号、列名可以准确定位一个值。当我们查询数据的时候,数据就能以行列表格的形式展现出来。HBase是一种NoSQL数据库,即非关系型数据库。那么,HBase中的数据是什么结构呢?和传统的关系型数据库有什么区别吗? 本篇目标:
- 掌握一张HBase表中有哪些组成部分
- HBase表各部分之间的关系是怎样的
- 了解HBase底层存储数据的物理结构
- 掌握几个有关于HBase表的重要概念
01
逻辑结构我们先通过两个模型来学习一张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数据的物理存储结构。
△物理结构图
通过物理结构,还要进一步理解几个知识点:
1.数据的版本(Version)注意看物理结构图中的标红部分,这两行数据除了值和时间戳不一样,其它都是一样的。当我们修改数据时,实际上是存了一条新数据,老数据并没有
立即删除。查询的时候,HBase也是返回最新的数据,也就是时间戳更大的那一条。也就是说,HBase通过时间戳给数据数据划分了不同版本,只不过用户感受不到。
2.Type属性Type = 'Put'表示新增数据,Type = 'Delete'表示删除数据。删除数据时,会新增一条Type = 'Delete'的数据,查询时数据不会返回,相当于数据被删除了。
HBase存储数据的文件是HFile格式的,打开后可以看到数据实际是这样的:
03
补充几个概念关于HBase的表,还有几个重要概念需要掌握,后面的学习中会反复提到。
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 —