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结构
- 头部
- 数据段
- 校验码
头部数据
数据段
数据段包含原始数据或加工过的原始数据,加工过程如下:
- 原始数据
- 编码 (可选)
- 加密 (可选)
- 压缩 (可选)
校验码
校验码字节数:
0byte⇐(bytesPerChecksum=0) ceil(header+databytesPerChecksum)×4byte
常用字节数计算
存储结构
- 头部
- 数据段
- 校验码
序列化结构
- 头部
- 数据段
- 校验码
- 下一个块的头部(可选)
⇐(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
阅读全文
0 0
- HFileBlock 源码解析 (hbase 1.2.6)
- HBase Canary源码解析
- Hadoop源码解析之: HBase Security
- hbase 源码解析之master篇1
- hbase 源码解析之master篇2
- HBase源码解析(一) HMaster启动流程
- Hbase源码解析和开发实战笔记
- HBase Replication源码解析之HLog读取
- HBASE RPC 源码实现及解析
- HBase中MemStore flush的源码解析
- 1.X Hbase的ConnectionFactory源码解析
- HBase源码解析(二) HMaster主要类成员解析
- Hbase源码走读(一)
- storm-hbase jar包中的bolt节点源码解析
- 【备忘】Hadoop,Hbase,Hive源码解析与开发实战
- hbase rest 源码解析 对象与字符串的互转
- 【备忘】Hadoop,Hbase,Hive源码解析与开发实战
- 【备忘】Hadoop,Hbase,Hive源码解析与开发实战
- K9F2G08 nandflash 底层读写、控制驱动程序,可随机读写
- Struts2 属性驱动
- 创建本地 python pip 库
- 信息学竞赛中搜索问题的常见优化技巧
- k最邻近算法——加权kNN
- HFileBlock 源码解析 (hbase 1.2.6)
- left join 、right join、inner join 区别
- 开始一个React项目(一)一个最简单的webpack配置
- 数据库_mysql(二)
- CF854B Maxim Buys an Apartment【思路】
- 三个实例演示 Java Thread Dump 日志分析
- CodeForces
- JanusGraph
- 复习-数据结构之线性表