深入理解HBase存储结构

下一章:HBase预写日志WAL机制

HBASE是一个高可靠性、高性能、面向列、可伸缩、实时读取的分布式存储系统数据库,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。

HBase介于nosql(非关系型数据库)和RDBMS(关系型数据库管理系统)之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。

HBase以表的形式来存储数据,为了方便直观感受,看下图
(逻辑视图)逻辑视图

RowKey(行键)

Rowkey相当于SQL中的主键。rowkey决定了row在表中的存储顺序,在HBase中,row的排序方式为字典顺序。
HBase中的三种查询方式: 1、基于Rowkey的单行查询 2、基于Rowkey的范围扫描 3、全表扫描 Row key行键 (Row
key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在Hbase内部,row
key保存为字节数组。

Column(列)

可以理解为其MySql中的列。基本的存储单位,一个或者多个列形成列族。 ColumnFamily(列族)
列族是我们在开始创建表的时候就需要定义的,它是表的一部分。 表中的有些属性也是在列族上定义的,比如过期时间、数据块缓存以及是否压缩等。
列比较灵活,不需要定义。但是在定义列名的时候,需要加上列族作为前缀。例: 列族存在的意义: 在表中,多少个列族比较合适?
官方建议:越少越好!!!因为太多列族没有必要,列族太多会极大降低数据库性能,容易出现Bug。

Cell(单元格)

{rowkey:column family:column:version}
一个列上可以存储多个版本的值,多个版本的值存储在多个单元格里面,多个版本之间通过版本号(Version)来区分

Time Stamp(时间戳)

时间戳就是实现多版本的关键所在。通过不同的timestamp来标识相同rowkey行对应的不同版本的数据。 HBase 中通过 rowkey
和 columns 确定的为一个存储单元(cell),每个cell都保存着同一份数据的多个版本,通过时间戳来索引。 时间戳的类型是 64
位整型。时间戳可以由 hbase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由 客户显式赋值。 每个
cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。 为了避免数据存在过多版本造成的的管理
(包括存贮和索引)负担,Hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

HBase中表的特点:
1、大:一个表可以有上十亿行,上百万列
2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列

HBase物理存储机制:图存储结构

1、Table 中的所有行都按照 Rowkey 的字典序排列。
2、Table 在行的方向上分割为多个 HRegion。
3、HRegion 按大小分割的(默认 10G),每个表一开始只有一个 HRegion,随着数据不断插入表,HRegion 不断增大,当增大到一个阀值的时候,HRegion 就会等分会两个新的 HRegion。 当表中的行不断增多,就会有越来越多的 HRegion。
4、HRegion 是 Hbase 中分布式存储和负载均衡的最小单元。最小单元就表示不同的 HRegion 可以分布在不同的 HRegionserver 上。但一个 HRegion 是不会拆分到多个 server 上的。
5、HRegion 虽然是负载均衡的最小单元,但并不是物理存储的最小单元。事实上,HRegion 由一个或者多个 Store 组成,每个 Store 保存一个 Column Family。每个 Strore 又由一个 MemStore 和 0 至多个 StoreFile 组成

Region内部结构
region内部结构
每个Region内部都包含一个或者多个Store,一个Store里面对应包含一个列族的数据,假如一个表中有两个列族,那么,对应的Region里面就有两个Store。

在store内部,又包含着memstore和store file两部分。

memstore:每个Store中有一个MemStore实例。数据写入WAL之后就会被放入MemStore。MemStore是内存的存储对象,只有当MemStore到达阈值(128MB)的时候,才会将数据刷写(flush)到HFile中。
store file和HFile:实际上,Store File就是HFile,HBase是由Java编写的,StoreFile就是HFie的抽象类而已。在物理存储上,HFile就是MemStore
刷写出来的文件。HFile直接和HDFS进行数据的传输。

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
1、HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
HFile内部结构图
HFile内部结构
HFile结构解读:

Data:数据块,保存表中的数据(可被压缩) Meta(Optioal):元数据块,保存用户自定义的 kv 对(可被压缩) File
Info:HFile的元数据信息,用户也可以在这一部分添加自己的元信息。 Data Index:存储Data块索引信息的块文件,每条索引的
key 是被索引的 block 的第一条记录的 key。 Meta Index:存储Meta块索引信息的块文件
Trailer:它存储了FileInfo、DataIndex、MetaIndex块的偏移值和寻址信息。

2、HLog File

HBase中WAL(Write Ahead Log预写日志) 的存储格式,物理上是Hadoop的Sequence File(序列化文件)

在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write
Ahead
Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的
HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取
到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay
HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

数据单元层次:
单元层次图


猜你喜欢

转载自blog.csdn.net/f1550804/article/details/88380764