StoreFiles(HFile)结构

StoreFile是HBase存储数据的文件格式。

HFile的逻辑结构
HFile逻辑结构图

在这里插入图片描述

逻辑结构说明

4大部分

  • Scanned block section

扫描StoreFile时,所有的Data Block(数据块)都将会被读取

Leaf Index(LSM + C1树索引)、Bloom block(布隆过滤器)都会被读取

  • Non-scanned block section

扫描StoreFile时,不会被读取

包含MetaBlock和Intermediate Level Data Index Blocks

  • Opening-time data section

在RegionServer启动时,需要将数据加载到内存中,包括数据块索引、元数据索引、布隆过滤器、文件信息。

  • Trailer

记录了HFile的基本信息

各个部分的偏移值和寻址信息

StoreFile物理结构

StoreFile是以Hfile的形式存储在HDFS上的。Hfile的格式为下图:

在这里插入图片描述

  • HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。正如图中所示的,Trailer中有指针指向其他数 据块的起始点。

  • File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等

  • Data Index和Meta Index块记录了每个Data块和Meta块的起始点。

  • Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。 每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。

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

在这里插入图片描述

  1. 开始是两个固定长度的数值,分别表示Key的长度和Value的长度

  2. 紧接着是Key,开始是固定长度的数值,表示RowKey的长度

  3. 紧接着是 RowKey,然后是固定长度的数值,表示Family的长度

  4. 然后是Family,接着是Qualifier

  5. 然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)——每一种操作都会生成一个Key-Value。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。

在这里插入图片描述

  • Data Block段

保存表中的数据,这部分可以被压缩

  • Meta Block段 (可选的)

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

  • File Info段

Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。

  • Data Block Index段

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

  • Meta Block Index段 (可选的)

Meta Block的索引。

  • Trailer

这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先 读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐