暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HBase-数据模型

码农大腿哥 2021-01-18
653
前言:

在关系型数据库中,数据是按行、列排列的。通过行号、列名可以准确定位一个值。当我们查询数据的时候,数据就能以行列表格的形式展现出来。

HBase是一种NoSQL数据库,即非关系型数据库。那么,HBase中的数据是什么结构呢?和传统的关系型数据库有什么区别吗?

本篇目标:
  1. 掌握一张HBase表中有哪些组成部分

  2. HBase表各部分之间的关系是怎样的

  3. 了解HBase底层存储数据的物理结构

  4. 掌握几个有关于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 有两个自带的命名空间,分别是 hbasedefaulthbase 中存放的是 HBase 内置的表;default 是用户默认使用的命名空间。

    2.Region

    一个Region相当于表的一个切片,根据Row Key进行划分。

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

    3.Store

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

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



    总结:

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

    比如修改一条数据时,在逻辑结构中就是修改了一个Cell的值,但在物理结构上是添加了一条新数据。

    其次,对于Region、Store这两个概念,一定要好好理解。这两个概念涉及了HBase的核心原理,后面的学习会经常出现。

    — END  —


    文章转载自码农大腿哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论