HFile 数据文件格式总结

2017-09-13 20:46:47来源:CSDN作者:ejdazhi人点击

分享

HFile类用于读写HBase数据文件,该文件主要存储数据、索引等信息,hbase 1.2.6中该类支持v1/2/3
格式的读取和v2/v3格式的写入,本文内容用主要针对v3格式数据。

数据文件的目录布局: region_dir/column_family_dir/hfile。

格式概况

数据文件由多个块组成,除尾部块外,其它类型块有HFileBlock统一处理读写、序列化、编码、加密、压缩、校验等工作,而尾部块的处理类为FixedFileTrailer,另外还有HFileBlockIndex、HFileInfo等类协助处理对应类型的块。

块类型

No. 类别 类型 标识符 含义
1 DATA DATA DATABLK* 数据块
2 DATA ENCODED_DATA DATABLKE 压缩数据块
3 INDEX LEAF_INDEX IDXLEAF2 叶索引
4 INDEX INTERMEDIATE_INDEX IDXINTE2 中间索引
5 INDEX ROOT_INDEX IDXROOT2 根索引
6 META META METABLKc 元数据块
7 META FILE_INFO FILEINF2 文件信息块
8 META TRAILER TRABLK”$ 尾部块
9 BLOOM BLOOM_CHUNK BLMFBLK2 布隆内部块
10 BLOOM GENERAL_BLOOM_META BLMFMET2 通用布隆块
11 BLOOM DELETE_FAMILY_BLOOM_META DFBLMET2 删除布隆块
12 ALL_CATEGORIES
13 UNKNOWN

文件格式

  • 扫描区域
    • DATA/ENCODED_DATA (0+) 数据块
    • LEAF_INDEX/BLOOM_CHUNK (内联块) 叶索引块或布隆组块
  • 非扫描区域
    • META (0+) 元数据块
    • INTERMEDIATE_INDEX (0+) 中间索引块
  • 常驻内存区域
    • ROOT_INDEX (1) 根索引块
    • ROOT_INDEX (1) 元数据索引块
    • FILE_INFO (1) 文件信息块
    • GENERAL_BLOOM_META/DELETE_FAMILY_BLOOM_META (0+) 布隆块
  • 尾部
    • TRAILER (1) 尾部块

注:内联块,根据需求出现在数据块之间或最后,每个内联块对应1个或多个数据块

块的数据结构

本节具体介绍了各种类型块的数据结构,结构中的数据类型对应与内存中的类型,实际的数据文件是经过编码、加密和压缩后的数据,并且写入时采用了不同编码方式的输出数据流,因此不能依据此处介绍直接解析数据文件。另外,并节内用不适用于尾部块,相关数据结构在下节介绍。

块结构

每个块有三部分组成:头部;数据段;校验码。各块的头不结构相同,数据段内容根据类型各不相同,校验码用于校验头部和数据段的组合数据。头部数据结构如下:

No. 变量明 类型 含义
1 blockType 8*byte 标识符
2 onDiskSizeWithoutHeader int 字节数(数据段+校验码)
3 uncompressedSizeWithoutHeader int 字节数(未压缩、未加密的数据段)
4 prevBlockOffset long 偏移量(上一个相同类型块在文件中的)
5 checksumType byte 校验码算法标识
6 bytesPerChecksum int 每个校验码对应的字节数
7 onDiskDataSizeWithHeader int 自己数(头部+数据段)

数据块

数据块按条存储原始数据,每条数据被曾为单元,单元在最后一条记录后追加,并且大于等于(可选比较类)最后一条记录,当数据块字节数达到允许值时,结束当前块并开始新块。

这里简单介绍一下单元的组成:

  • row (byte[]) 行名称
  • column family (byte[]) 列组的名称
  • column qualifier (byte[]) 列名称
  • timestamp (long) 时间戳
  • type (byte) 单元类型(添加、删除等)
  • MVCC version (long)
  • value (byte[]) 值
  • tags (byte[]) 标签

块数据段单条记录组成:

  • row + family + qualifier 字节数(int)
  • value 字节数(int)
  • row 字节数(short)
  • row 数组(byte[])
  • family 字节数(byte)
  • family 数组(byte[])
  • qualifier 数组(byte[])
  • timestamp (long)
  • type (byte)
  • value 数组(byte[])
  • tags 长度(short 可选)
  • tags 数组(byte[] 可选)
  • region 序列号 (long 可选)

索引块

索引块分为叶索引块、中间索引和根索引块。当数据块数量小于索引块允许条数时只有根索引,称为单级索引模式。当根索引内记录条数超限,增加一级叶索引,叶索引块紧随在对应的全部数据块之后,这时称为两级索引模式。当两级索引时,其根索引记录数仍然超限,则增级一级或多级中间索引,直至根索引记录数满足要求,这种模式称为多级索引模式。多级索引模式下,中间索引块位于非扫描区域,写入顺序为先写入全部低级中间索引,再写入全部高一级的中间索引。

索引的记录格式分两种:数据块记录和索引块记录。单级模式中,根索引块包含数据块记录。双级模式中叶索引块包含数据块记录,根索块包含索引块记录。多级模式中增加的中间索引块包含索引块记录。

记录的键字符数组组成:

  • row 字节数(short)
  • row 数组(byte[])
  • family 字节数(byte)
  • family 数组(byte[])
  • qualifier 数组(byte[])
  • timestamp (long)
  • type (byte)

数据块记录组成:

  • 对应下级数据块的第一个单元(或优化后)的键字符数组(byte[])
  • 对应下级数据块在文件中的偏移量(long)
  • 对应下级数据块字节数(int)

注:优化指创建一个单元,该单元位于上一个块最末单元和本块第一个单元之间,且键字符数组最短。

索引块记录组成:

  • 对应下级索引块的第一个记录的键字符数组(byte[])
  • 对应下级索引块在文件中的偏移量(long)
  • 对应下级索引块字节数(int)

叶索引块/中间索引块组成:

  • 记录数(int)
  • loop i(0~n):记录累计字节数
  • loop j(0~n-1):块偏移量(long)
  • loop j(0~n-1):块字节数(int)
  • loop j(0~n-1):块记录(byte[])

根索引块组成:

  • loop i: 块的偏移量(long)
  • loop i: 块的字节数(int)
  • loop i: 块的第一个记录(byte[])
  • 中位键所在叶索引块偏移量(双/多级模式)
  • 中位键所在叶索引块字节数(双/多级模式)
  • 中位键在本叶索引块内的序号(双/多级模式)

文件信息块

文件信息块存储的是多个键值对,这些参数适用于全部数据文件。
HFile中预定义了一些键值对,也可根据需要自行添加。

预定义键值对:

  • hfile.LASTKEY 文件中最后一个单元的键字符数组
  • hfile.AVG_KEY_LEN 键字符数组的平均长度
  • hfile.AVG_VALUE_LEN 值字符数组的平均长度
  • hfile.CREATE_TIME_TS 时间戳
  • hfile.COMPARATOR 比较器
  • hfile.TAGS_COMPRESSED 标签是否压缩
  • hfile.MAX_TAGS_LEN 单元标签最大长度

其它块

  • 元素据块已不再使用,元数据索引块数据段为空。
  • 布隆组块和布隆块由HTable解释,这里不做介绍。

尾部块

尾部块与其它块结构不同,没有头部和校验码,只有多个键值对,且长度固定为4k,最后4个字节为版本号,其中后三个字节为主版本号、第一个字节为次版本号。尾部块键值对如下:

No. 名称 类型 含义
1 fileInfoOffset long 文件信息块偏移量
2 loadOnOpenDataOffset long 打开及加载起始块的偏移量
3 dataIndexCount int 根索引块记录数量
4 uncompressedDataIndexSize long 所有块的数据索引未压缩体积
5 metaIndexCount int 元数据索引块记录数
6 totalUncompressedBytes long 文件内所有键值对未压缩体积
7 entryCount long 文件内键值对数量
8 compressionCodec Algorithm 所有块的压缩算法
9 numDataIndexLevels int 数据索引级数
10 firstDataBlockOffset long 第一个数据块偏移量
11 lastDataBlockOffset long 最后一个数据块偏移量
12 comparatorClassName String 键比较类名称
13 encryptionKey byte[] 加密钥匙
14 majorVersion int 主版本号
15 minorVersion int 次版本号

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台