您的位置:首页 > 其它

HFileBlock 源码解析 (hbase 1.2.6)

2017-09-08 11:34 381 查看

HFileBlock

HBase数据文件是由多个Block和一个Trailer组成,Block有数据、索引等多种类型。HFileBlock提供了一个统一的类来处理各种类型的Block,可以实现Block的存储、序列化及其反向过程,还可以估算占用堆内存的字节数。

HFileBlock可以读/写v2格式数据文件,读操作兼容v1格式。为了便于源码解析,本文内容只针对v2格式。

目的

Block结构

存储结构

序列化结构

存储流程

其它

buf结构

unPack方法

估算堆内存字节数

Block结构

头部

数据段

校验码

头部数据

变量名类型说明
blockType8*byte标识符
onDiskSizeWithoutHeaderint字节数(数据段+校验码)
uncompressedSizeWithoutHeaderint字节数(unPack的数据段)
prevBlockOffsetlong文件偏移量(前一个相同类型Block)
checksumTypebyte校验方法标识
bytesPerChecksumint一个校验码对应的字节数
onDiskDataSizeWithHeaderint字节数(头部+数据段)

数据段

数据段包含原始数据或加工过的原始数据,加工过程如下:

原始数据

编码 (可选)

加密 (可选)

压缩 (可选)

校验码

校验码字节数:

0byte⇐(bytesPerChecksum=0)

ceil(header+databytesPerChecksum)×4byte

常用字节数计算

组合计算方法
头部 + 数据段 + 校验码onDiskSizeWithoutHeader + headerSize
数据段 + 校验码onDiskSizeWithoutHeader
unpacked的数据段uncompressedSizeWithoutHeader
头部 + 数据段onDiskDataSizeWithHeader

存储结构

头部

数据段

校验码

序列化结构

头部

数据段

校验码

下一个块的头部(可选) ⇐(nextBlockOnDiskSizeWithHeader>0)

usesHBaseChecksum(boolean: true)

offset (long) 块起始位置在文件中的偏移量

nextBlockOnDiskSizeWithHeader(int)下一块的头部和数据段字节数

存储流程

Cell流程

实例化Writer类

调用方法startWriting

多次调用方法write(Cell)

调用方法writeHeaderAndData

BlockWritable流程

实例化Writer类

调用writeblock

自定义流程

实例化Writer类

调用方法startWriting返回输出流

直接写入输出流

调用方法writeHeaderAndData

其它

buf (ByteBuffer) 结构

头部

数据段

校验码 (limit设置在结束位置)

下一个Block头部 (可选)

unPack方法

unPack方法返回一个HFileBlock对象,该对象的头部和校验码与原对象一致,只是对数据段进行了解压、解密处理,新对象的数据段是编码后的原始数据或原始数据(未使用编码)。

isUnpacked方法

判断当前对象是否unpacked,根据是下列字节数之和是否等于buf的容量:

头部字节数

uncompressedSizeWithoutHeader

校验码字节数

下个Block头部字节数 (可选)

heapSize方法

HFileBlock估算对象占用堆内存字节数的方法是将所有非静态字段占用字节数相加,具体内容如下:

OBJECT: this

REFERENCE: blockType

REFERENCE: fileContext

REFERENCE: buf

SIZEOF_INT: onDiskDataSizeWithHeader

SIZEOF_INT: onDiskSizeWithoutHeader

SIZEOF_INT: uncompressedSizeWithoutHeader

SIZEOF_INT: nextBlockOnDiskSizeWithHeader

SIZEOF_LONG: prevBlockOffset

SIZEOF_LONG: offset

buf.heapSize

flieContext.heapSize
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hbase 源码 存储 结构 ydb