浅析HBase架构和系统结构介绍(四)


4 HBase存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:

1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装。

2. HLogFile,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File。

4.1 HFile

下图是HFile的存储格式:



Ø  Trailer段:

Trailer是定长的。正如图中所示的,Trailer中有指针指向其他数据块的起始点,读取一个HFile时,会首先读取Trailer,然后DataBlock Index会被读取到内存中,这样当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个block读取到内存中,再找到需要的key。

Ø  File Info段:

Hfile是定长的,记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN,LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。

Ø  Data Block段:

Data Block保存表中的数据,是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的block cache机制。每个Data块的大小可以在创建一个table的时候通过参数指定,大号的block有利于顺序scan,小号block利于随机查询。 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏。后面会详细介绍每个KeyValue对的内部构造。

Ø  Meta Block段(可选的):

保存用户自定义的KeyValue对,可以被压缩。

Ø  Data Block Index段:

Data Block的索引,每条索引的key是被索引的block的第一条记录的key。

Ø  Meta Block Index段(可选的):

Meta Block的索引。

 

HFile里面的每个KeyValue对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。我们来看看里面的具体结构:

开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是 RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。

4.2 HLog/WAL

    WAL意为Write ahead log,类似Mysql中的binlog,用来做灾难恢复。Hlog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。每个HRegionServer维护一个HLog,而不是每个HRegion一个。这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。带来的麻烦是,如果一台HRegionServer下线,为了恢复其上的region,需要将HRegionServer上的log进行拆分,然后分发到其它HRegionServer上进行恢复。

        

      上图中示意了HLog文件的结构,其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequencenumber。

HLogSequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。

相关内容