HBase(2.3)-HBase存储格式、数据模型

1.HBase数据模型
1.1 逻辑视图
HBase(2.3)-HBase存储格式、数据模型_第1张图片
hbase模式里的逻辑实体包括:
(1)表(table):HBase用表来组织数据。表名是字符串(String),由可以在文件系统路径里使用的字符组成。
(2)行(row):在表里,数据按行存储。行由行键(rowkey)唯一标识。行键没有数据类型,总是视为字节数组byte []。
(3)列族(column family):行里的数据按照列族分组,列族也影响到HBase数据的物理存放,因此,它们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据。列族名字是字符串(String),由可以在文件系统路径里使用的字符组成。
(4)列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义,列限定符不必在不同行之间保持一致。就像行键一样,列限定符没有数据类型,总是视为字节数组byte []。
(5)单元(cell):行键、列族和列限定符一起确定一个单元。存储在单元里的数据称为单元值(value)。值也没有数据类型,总是视为字节数组byte []。 相同 Cell:RowKey/ClolumFamily/Column相同
(6)时间版本(version):单元值有时间版本。时间版本用时间戳标识,是一个long。没有指定时间版本时,当前时间戳作为操作的基础。HBase保留单元值时间版本的数量基于列族进行配置,默认数量是3个。
HBase的每个数据值使用坐标来访问。一个值的完整坐标包括行键、列族、列限定符和时间版本。由于把所有坐标视为一个整体,因此HBase可以看作是一个键值(key-value)数据库。
Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对hbase中的数据进行快速定位。

1.2 物理模型
(1) Table中的所有行都按照Row Key的字典序排列
(2) Table 在行的方向上分割为多个HRegion
(3) HRegion按大小分割的,每个表一开始只有一个HRegion,随着数据不断插入表,HRegion不断增大,当增大到一个阀值的时候,HRegion就会等分会两个新的HRegion。当Table 中的行不断增多,就会有越来越多的Hregion。默认一个HRegion超过256M就要被分割成两个。
(4) HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的HRegionServer上。但一个HRegion是不会拆分到多个Server上的
HBase(2.3)-HBase存储格式、数据模型_第2张图片
(5) HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。
事实上,每个HRegion由一个或者多个Store组成,每个列族columns family对应一个Store实例。
每个Strore又由一个memStore(存储在内存中)和0至多个StoreFile对应,每个StoreFile对应一个HFile,HFile就是实际的存储文件,存储在HDFS上。如图:
HBase(2.3)-HBase存储格式、数据模型_第3张图片

StoreFile以HFile格式保存在HDFS上

HBase(2.3)-HBase存储格式、数据模型_第4张图片
总结:
一个RegionServer有多个Region
一个Table会有多个Region,一个Region包含Table的一部分
Region中有多个RowKey
每一个Table的列族对应一个Store文件
每一个Store文件包含多个StoreFile和一个MemStore
StoreFile对应存储文件HFile

1.3 MemStore和HFile
HBase是基于BigTable的面向列的分布式存储系统,其存储设计是基于Memtable / SSTable设计的,主要分为两部分,一部分为内存中的MemStore (Memtable),另外一部分为磁盘(这里是HDFS)上的HFile (SSTable)。还有就是存储WAL的log,主要实现类为HLog.
1.3.1 MemStore
  本质上MemStore就是一个内存里放着一个保存KEY/VALUE的MAP,当MemStore(默认64MB)写满之后,会开始刷磁盘操作。

1.3.2 HFile
HBase存储在HDFS上的主要包含两种文件类型:
  (1) HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
  (2) HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

(1)HFile结构

HBase(2.3)-HBase存储格式、数据模型_第5张图片
Data Block:保存表中的数据,存储实际的KeyValue数据,这部分可以被压缩
Meta Block:(可选)保存用户自定义的kv对,可以被压缩。
File Info :Hfile的meta元信息,不被压缩,定长。
Data Block Index :Data Block的索引。每个Data块的起始点。
Meta Block Index:(可选的)Meta Block的索引,Meta块的起始点。
Trailer: 定长。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer有指针指向其他数据块的起始点,保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。
HFile的Data Block,Meta Block通常采用压缩方式存储。Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。

(2)HFile中的Key-Value结构
Magic字段:存储随机数,防止数据损坏,存储偏移量和首Key
HFile中的每个Key-Value对就是一个简单的byte数组。但这个byte数组包含了很多项信息,并含有固定的结构。(有点类似数据流)
这里写图片描述
开始是两个长度固定的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family(列族),接着是Qualifier(小列),然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分则相对简单,是纯粹的二进制数据。
HBase 为每个值维护了多级索引,即:

<key, column family, column namequalifer), timestamp>

你可能感兴趣的:(HBase,hbase)