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。
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个或多个数据块
这里简单介绍一下单元的组成:
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解释,这里不做介绍。
格式的读取和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 可选)
索引块
索引块分为叶索引块、中间索引和根索引块。当数据块数量小于索引块允许条数时只有根索引,称为单级索引模式。当根索引内记录条数超限,增加一级叶索引,叶索引块紧随在对应的全部数据块之后,这时称为两级索引模式。当两级索引时,其根索引记录数仍然超限,则增级一级或多级中间索引,直至根索引记录数满足要求,这种模式称为多级索引模式。多级索引模式下,中间索引块位于非扫描区域,写入顺序为先写入全部低级中间索引,再写入全部高一级的中间索引。索引的记录格式分两种:数据块记录和索引
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. | 名称 | 类型 | 含义 |
---|---|---|---|
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 | 次版本号 |
相关文章推荐
- netcdf数据nc格式数据java解析总结(二)使用java生成.nc格式文件
- 用MR生成HFile文件格式后,数据批量导入HBase
- [开发总结]系统架构及数据模型----AutoDesk文件格式转换篇(五)
- 读取含有json格式数据的txt文件 并且把数据保存到数据库
- warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
- php excel 读取日期问题 在 php excel 读取 xls 格式的文件时,xls 上面显示的是正常的日期格式 但是读取出来的话,就会是一个万位整形数据,这显然不是我们想要的日
- C#源码学习之---将数据库数据以XML文件格式保存
- 【原创】将数据生成json文件下载以及json中文乱码和优化json文件格式的方法
- Programming Hive Chapter3 (数据类型和文件格式)
- 使用C语言实现从一段pcm格式音频文件中截取一段数据
- mysql 将数据导出成excel文件(.xls格式)
- warning C4819: 该文件包含不能在当前代码页(936)中表示的字符,请将该文件保存为 Unicode 格式以防止数据丢失
- uuids.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
- 本节描述PCD(点云数据)文件格式。
- [置顶] 存储系统实现-数据文件格式
- iOS编程中的音频知识(一):文件格式和数据格式,哦!天哪
- 《利用python进行数据分析》读书笔记--第六章 数据加载、存储与文件格式
- Lucene学习总结之三:Lucene的索引文件格式(1)
- SQLServer 常用格式数据文件导入导出之一
- libsvm数据格式、c语言输出符合libsvm要求格式的特征文件代码