本文主要介绍Hbase中HFile的结构,说明下结构中各区域的作用
1.HFile文件结构
image
每个region对应一个rowKey范围,每个HFile对应一个ColumnFamily。逻辑上,该文件包含四块区域:
Tailer:文件尾,主要记录version版本,不同的版本Trailer的字段不一样,以及一些偏移信息,后面详细描述;
Load-on-open-section:这部分数据在RegionServer启动时,实例化Region时将所有的StoreFile的Load-on-open-section加载进内存,主要存放了Root Data Index、Meta Index、FileInfo及Bloom Filter的metadata等。除Fields for MidKey,其他每部分都是HFileBlock,后面会详细讲这块。
Non-Scanned Block Section:BloomFilter的元数据信息(MetaBlock)以及Data Block的第二层索引。
Scanned block section:存储实际block数据部分。
2 HFile Block
HFile枚举类BlockType声明了十几种Block类型:
image
HFileBlock主要分为2部分:Block Header和Block Data。其中,Block Header用来存储元数据,包括block类型,压缩block大小,上一个block的偏移量等;而Block Data主要存储具体的数据。下图所示两个版本的HFileBlock均支持读取,但写入时仅支持version 2,后续v1将弃用。
image
3 Trailer Block
主要记录了HFile的基本信息、各个部分的偏移值和寻址信息,字段信息如下表所示。
image
HFile在读取的时候首先会解析Trailer Block并加载到内存,然后再进一步加载LoadOnOpen区的数据。
4 Index Block
HFile V2
版本Index Block
有两类:Root Index Block
和NonRoot Index Block
,其中NonRoot Index Block
又分为Intermediate Index Block
和Leaf Index Block
两种。HFile
中索引结构类似于一棵树,Root Index Block
表示索引数根节点,Intermediate Index Block
表示中间节点,Leaf Index block
表示叶子节点,叶子节点直接指向实际数据块。
对于Data Block,由于HFile刚开始数据量较小,索引采用single-level结构,只有Root Index一层索引,直接指向数据块。当数据量慢慢变大,Root Index Block满了之后,索引就会变为mutil-level结构,由一层索引变为两层,根节点指向叶子节点,叶子节点指向实际数据块。如果数据量再变大,索引层级就会变为三层。
对于Root Index Block,其结构如下
image
其中Index Entry表示具体的索引对象,每个索引对象由3个字段组成,Block Offset表示索引指向HFile中数据块的偏移量,BlockDataSize表示索引指向数据块在磁盘上的大小,BlockKey表示索引指向数据块中的第一个key。除此之外,还有另外3个字段用来记录MidKey的相关信息,MidKey表示HFile所有Data Block中中间的一个Data Block,用于在对HFile进行split操作时,快速定位HFile的中间位置。
作者:薛定谔的猫Plus
链接:https://www.jianshu.com/p/20206027b53e