HFileBlock 源码解析 (hbase 1.2.6)

来源:互联网 发布:手机黄金交易软件 编辑:程序博客网 时间:2024/06/05 20:20

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
原创粉丝点击