HBase 数据模型

HBase 数据模型主要由table,row,column,timestamp,cell几个元素构成。

table

表,一个表可能包含多行数据,在HBase中,表其实是一个分布式的表,真正的数据是存储在Region中的,Region可以理解为分片,每个表会包含多个分片,分别由不同的RegionServer管理。每个分片会有多个副本,以实现分片的高可用。

row

行,一行数据包含唯一的rowkey,多个column及对应的值,在Hbase中,一张表中所有row都按照rowkey的字典顺序由小到大排列;因为数据在Region上的分布也与rowkey相关,所以在存储数据时,设计合理的rowkey使得数据尽可能在Region上分布均匀,在查询数据时就不会出现一个RegionServer负载过高,而其他RegionServer负载较低的情况。

column

列,与关系型数据的列不同,HBase中的column由column family(列簇)和 qualifier(列)组成。两者之间使用":"相连。 一个列簇下可以有多个列;

列簇设计的好处

在介绍列簇之前先对比一下行式存储与列式存储;

行式存储

数据以行的形式进行存储,一行写完之后,再写下一行;我们经常使用的Mysql数据库就是一个典型的行式存储。

行式存储优点:

  • 1,在存储时以行为单位,在读取一行数据时,效率很高;
  • 2,由于数据存储在一个文件中,在读取数据时打开的文件句柄较少;

行式存储缺点:

  • 当读取某些指定列式,需要先读取每行数据,然后进行裁剪,需要处理较多对当前查询无用的信息,且占用内存。

列式存储

列式存储将一列数据存储在一起,不同列的数据分别存储;

列式存储优点

  • 1,由于某一列的数据类型相同可以进行数据压缩,在备份和主从复制时产生的数据量较少;
  • 2,在只查询某一列或者几列时,只需要读取某几个列的文件,且不需要裁剪;
    列式存储缺点:
  • 在读取一行数据时需要打开多个文件,占用句柄较多;

列簇存储

列簇存储的出现很好的兼容的行式存储和列式存储。在HBase中一个列簇对应一个HFile文件,列簇中可以包含多个列。当一个列簇中存在多列时,这个列簇相当于行存储,当一个列簇中只有一列时,这个列簇相当于列存储。这样HBase的列簇很好的兼容了行,列存储的优点。我们在使用的过程中,可以建立多个列簇,将经常需要一起读出的字段放到一个列簇,而需要大数据量计算的某几列可以单独放到各自的列簇。

cell 

单元格,由五元组(rowkey,column,timestamp,type,value)组成,其中type标识操作的类型(Put/Delete)这样的操作类型。在HBase底层以KV形式存储,key为(rowkey,column,timestamp,type),值为value.

timestamp

时间戳,每个单元格在写入HBase时都默认分配一个时间戳,作为单元格的版本。用户在写入时也可以自带时间戳。HBase支持多版本特性,同一个rowkey,column下可以有多个value存在,这些value使用timestamp作为版本号,版本号越大,数据越新;

HBase的逻辑视图如下:

其内部包含了两行数据,对应两个rowkey:com.cnn.www和com.example.www;三个列簇:anchor,conetents和people;其中anchor中包含两列:cnnsi.com和my.look.ca;时间戳分别是t9和t8;value为CNN和CNN.com;另外两个列簇分别只包含一个列,contents->html,people->anthor;其中contents的第一行,html列包含三个版本的数据。

posted @ 2021-06-19 21:16  arax  阅读(852)  评论(0编辑  收藏  举报