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结构
头部数据段
校验码
头部数据
变量名 | 类型 | 说明 |
---|---|---|
blockType | 8*byte | 标识符 |
onDiskSizeWithoutHeader | int | 字节数(数据段+校验码) |
uncompressedSizeWithoutHeader | int | 字节数(unPack的数据段) |
prevBlockOffset | long | 文件偏移量(前一个相同类型Block) |
checksumType | byte | 校验方法标识 |
bytesPerChecksum | int | 一个校验码对应的字节数 |
onDiskDataSizeWithHeader | int | 字节数(头部+数据段) |
数据段
数据段包含原始数据或加工过的原始数据,加工过程如下:原始数据
编码 (可选)
加密 (可选)
压缩 (可选)
校验码
校验码字节数: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源码解析(二) HMaster主要类成员解析
- 【备忘】Hadoop,Hbase,Hive源码解析与开发实战
- HBase中MemStore flush的源码解析
- 【备忘】Hadoop,Hbase,Hive源码解析与开发实战
- Hadoop基础教程-第13章 源码编译(13.3 HBase1.2.6源码编译)
- hbase 源码解析之master篇1
- hbase 源码解析之master篇1
- hbase 源码解析之master篇2
- HBase源码解析(一) HMaster启动流程
- Hbase源码解析和开发实战笔记
- hbase 源码解析之master篇2
- TreeSet&NavigableMap&NavigableSet源码解析 给jdk写注释系列之jdk1.6容器(8)
- fastjson深度源码解析- 反序列化(一) - 反序列化解析介绍
- Tomcat源码解析(八):Host
- Log4j源码解析--核心类解析
- Java 集合系列Stack详细介绍(源码解析)和使用示例
- ReactiveCocoa之RAC宏展开解析【iOS源码阅读】
- Asp 解析 XML并分页显示源码
- Retrofit 源码解析
- jQuery行级解析读取XML文件(附源码)