您的位置:首页 > 其它

HFile 数据文件格式总结

2017-09-13 12:07 423 查看
HFile类用于读写HBase数据文件,该文件主要存储数据、索引等信息,hbase 1.2.6中该类支持v1/2/3

格式的读取和v2/v3格式的写入,本文内容用主要针对v3格式数据。

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

格式概况

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

块类型

No.类别类型标识符含义
1DATADATADATABLK*数据块
2DATAENCODED_DATADATABLKE压缩数据块
3INDEXLEAF_INDEXIDXLEAF2叶索引
4INDEXINTERMEDIATE_INDEXIDXINTE2中间索引
5INDEXROOT_INDEXIDXROOT2根索引
6METAMETAMETABLKc元数据块
7METAFILE_INFOFILEINF2文件信息块
8METATRAILERTRABLK”$尾部块
9BLOOMBLOOM_CHUNKBLMFBLK2布隆内部块
10BLOOMGENERAL_BLOOM_METABLMFMET2通用布隆块
11BLOOMDELETE_FAMILY_BLOOM_METADFBLMET2删除布隆块
12ALL_CATEGORIES
13UNKNOWN

文件格式

扫描区域

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.变量明类型含义
1blockType8*byte标识符
2onDiskSizeWithoutHeaderint字节数(数据段+校验码)
3uncompressedSizeWithoutHeaderint字节数(未压缩、未加密的数据段)
4prevBlockOffsetlong偏移量(上一个相同类型块在文件中的)
5checksumTypebyte校验码算法标识
6bytesPerChecksumint每个校验码对应的字节数
7onDiskDataSizeWithHeaderint自己数(头部+数据段)

数据块

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

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

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 可选)

索引块

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

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

记录的键字符数组组成:

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.名称类型含义
1fileInfoOffsetlong文件信息块偏移量
2loadOnOpenDataOffsetlong打开及加载起始块的偏移量
3dataIndexCountint根索引块记录数量
4uncompressedDataIndexSizelong所有块的数据索引未压缩体积
5metaIndexCountint元数据索引块记录数
6totalUncompressedByteslong文件内所有键值对未压缩体积
7entryCountlong文件内键值对数量
8compressionCodecAlgorithm所有块的压缩算法
9numDataIndexLevelsint数据索引级数
10firstDataBlockOffsetlong第一个数据块偏移量
11lastDataBlockOffsetlong最后一个数据块偏移量
12comparatorClassNameString键比较类名称
13encryptionKeybyte[]加密钥匙
14majorVersionint主版本号
15minorVersionint次版本号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐