Hbase1.2:Hbase数据模型、HBase逻辑结构、HBase基础数据模型、HBase基础数据模型拆分、HBase物理存储结构、HBase数据模型相关名词概念

Hbase1.2:Hbase数据模型、HBase逻辑结构、HBase基础数据模型、HBase基础数据模型拆分、HBase物理存储结构、HBase数据模型相关名词概念

HBase数据模型

HBase的设计理念依据Google的BigTable论文(讲存储的),论文中对于数据模型的首句介绍。

BigTable是一个稀疏的、分布式的、持久的多维的、排序的、map

稀疏:什么是稀疏?与关系型数据库对比,如MySQL中数据是数据表的形式,表格再底层存储的时候,要求是比较高的,每个行与列相对应的一个表格(某行数据的某个字段),都需要留好位置,会造成存储空间的浪费。当你的列很少的时候,是可以确保里面没有空值的情况,但是大数据是百万列的,肯定会有大量空值的,因此如果使用关系型数据库存储,遇上这种大量空值的情况会浪费大量的空间,而使用BigTable这种结构,它是稀疏的,格为空,则不存,不存就不会造成空间浪费,这在大数据场景下是非常必要的。
分布式:没啥好说的,存储海量数据,不可能单机存储,必须分布式。
持久:作为一个数据库是持久化是必然的。数据库存储数据必然是要持久化保存,单纯保存在内存中和数据库的理念是背道而驰的。
多维:非关系型数据库的本质是KV结构,但如果只是跟Java中的hashmap一样,是单维的,即给一个key,得到一个value,所以相应的问题就是这样存储的数据太单一,不够全面。BigTable是多维的。
排序:存储和读写的基本常识就是,数据要有序。无序的数据想要准确的去查找一条,是需要整个遍历一遍的,但如果是排序的就不一样了,可以按照相应的算法去缩短检索的过程,比如最简单的二分查找。
map:映射,指的就如是hashmap中的KV这种映射。

之后对于映射的解释如下:

key:该映射由行键、列键和时间戳索引;
value:映射中的每个值都是一个未解释的字节数组(是一个字节数组)。

未解释:表示经过序列化了;或者说是没有办法用UTF-8编码的字符串,也就是不是一个能直接读的字符串。这样的好处就是可以更节省存储空间。存一个字符串和存一个序列化之后的字符串,所占空间是不一样的。

最终HBase关于数据模型和BigTable的对应关系如下:

Hbase使用与BigTable非常相似的数据模型。用户将数据存储在带标签的表中。数据行具有可排序的键任意数量的列。该表存储稀疏,因此如果用户喜欢,同一表中的行可以具有疯狂变化的列

疯狂变化的列:即可以动态追加列,毕竟百万列,不可能设计之初就知道存哪些,都是后续进化才慢慢全面,所以支持动态追加列,这一点也是和关系型数据库区别最大的一点

最终理解为Hbase数据模型的关键在于稀疏、分布式、多维、排序、的映射(map)。其中映射map指代非关系型数据库的key-value结构。

HBase逻辑结构

HBase可以用于存储多种结构的数据,以JSON为例,存储的数据原貌为:

HBase基础数据模型

HBase逻辑结构整体特点:存储数据稀疏,数据存储多维,不同的行具有不同的列,数据存储整体有序:

  • RowKey:按照RowKey(行号)的字典序排列,RowKey为Byte数组,是用来排序和整理数据的,它一定会按照字典序去排序,从左到右,一个个字符串序列化后称为Byte,比较字典序ASCII码的大小,小的在前;
  • 列族(column family):同时引入了列族(column family)的概念;
  • :列就类似于关系型数据库中数据表的列名。

基础数据模型如下:
请添加图片描述
数十亿行,数百万列,如果不对它进行拆分是没办法存储的,因此要在基础模型的基础上进行拆分,拆分很多次,拆成很小的单位,这些拆分都是为了方便存储,拆分的顺序:

HBase基础数据模型拆分:1.横向拆分

横向拆分(按照RowKey的字典序进行拆分)-将表格按照行拆分,块名称为Region,用于实现分布式存储。
按照行去拆分,这个是个习惯问题,在使用数据表格的时候,通常都是以行为单位的,写数据的时候,也是如此,一次写一行,而不是先写某些列,再写某些列。
按照行号拆分之后,会有一个Region(区域、或者理解为范围)的概念,每个Region的RowKey范围是不一样的,互相不交叉,互相不影响。
请添加图片描述

HBase基础数据模型拆分:2.纵向拆分

纵向拆分-按照列族拆分为store用于底层存储到不同的文件夹中,便于文件对应。
因为有数百万列,所以不拆分放一起,数据量还是很大,因此要纵向拆分,拆分之后的数据块叫做store,纵向拆分是以列族作为单位拆分的。
请添加图片描述

HBase物理存储结构

物理存储结构即为数据映射关系,而在概念视图的空单元格,底层实际根本不存储。
Hbase是以HDFS(Hadoop分布式文件系统)作为存储基础的数据库,数据是存在HDFS上的。
HDFS在对文件存储的时候,有一个非常标志性的特点,它不能修改数据,Hbase作为一个数据库,肯定需要实现数据修改的操作,因此需要在这种不能修改数据,而达到类似修改的效果,就用到版本号了。

timestamp版本号:会以时间戳的版本来进行区分,不同版本(version)的数据根据timestamp进行区分,读取数据默认读取最新的版本,默认使用的是当前系统的时间。

对于删除操作,其类型为Delete Column,同理也会有时间戳版本号,比如row_key1先有put,然后有delete,那么由于delete的版本号时间戳在后,所以是新数据,因此在检索的时候,会认为数据已经删除。

请添加图片描述

HBase数据模型相关名词概念

Name Space

命名空间,类似于关系型数据库的database概念,每个命名空间有多个表。HBase两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default是用户默认使用的命名空间。

Table

类似于关系型数据库的表的概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列,在列族下面可以动态的追加列。因为数据存储是稀疏的,所有向HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。

Row

HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据只能根据RowKey进行检索,所以RowKey的设计十分重要
因为HBase是无法写SQL的,所以读取数据是根据RowKey,获取哪一行,就要先知道对应行号。这也是HBase不太好用的根本原因。

Column

HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符,平时交流时就叫列名即可)进行限定,用冒号隔开,例如info:name,info:age。建表时,只需要指明列族,而列限定符无需预先定义。

Time Stamp

用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。

Cell

就是BigTable中的map的模型由{rowkey,column Family;column Qualifier,timestamp}唯一确定的单元,后面还会根据type去判断对应类型,指的是底层存储的一行数据。cell中的数据全部是字节码形式存储。

猜你喜欢

转载自blog.csdn.net/qq_41929714/article/details/130202420