HFile存储格式


Table of Contents

HFile存储格式
Block块结构

HFile存储格式

HFile是参照谷歌的SSTable存储格式进行设计的,所有的数据记录都是通过它来完成持久化,其内部主要采用分块的方式进行存储,如图所示:


每个HFile内部包含多种不同类型的块结构,这些块结构从逻辑上来讲可归并为两类,分别用于数据存储和数据索引(简称数据块和索引块),其中数据块包括:

(1) DATA_BLOCK:存储表格数据

(2) BLOOM_CHUNK:存储布隆过滤器的位数组信息

(3) META_BLOCK:存储元数据信息

(4) FILE_INFO:存储HFile文件信息

索引块包括:

  • 表格数据索引块(ROOT_INDEX、INTERMEDIATE_INDEX、LEAF_INDEX)

    在早期的HFile版本中(version-1),表格数据是采用单层索引结构进行存储的,这样当数据量上升到一定规模时,索引数据便会消耗大量内存,导致的结果是Region加载效率低下(A region is not considered opened until all of its block index data is loaded)。

    因此在version-2版本中,索引数据采用多层结构进行存储,加载HFile时只将根索引(ROOT_INDEX)数据载入内存,中间索引(INTERMEDIATE_INDEX)和叶子索引(LEAF_INDEX)在读取数据时按需加载,从而提高了Region的加载效率。

  • 元数据索引块(META_INDEX)

    新版本的元数据索引依然是单层结构,通过它来获取元数据块信息。

  • 布隆索引信息块(BLOOM_META)

    通过索引信息来遍历要检索的数据记录是通过哪一个BLOOM_CHUNK进行映射处理的。

从存储的角度来看,这些数据块会划分到不同的区域进行存储。

  1. Trailer区域

    该区域位于文件的最底部,HFile主要通过它来实现相关数据的定位功能,因此需要最先加载,其数据内容是采用protobuf进行序列化处理的,protocol声明如下:

    message FileTrailerProto {
        optional uint64 file_info_offset = 1; 1
        optional uint64 load_on_open_data_offset = 2; 2
        optional uint64 uncompressed_data_index_size = 3; 3
        optional uint64 total_uncompressed_bytes = 4; 4
        optional uint32 data_index_count = 5; 5
        optional uint32 meta_index_count = 6; 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值