HBase 加载Hfile时的读取过程
Hfile分为4部分,其中loadOnOpen section 和trailer这2部分是open file时就会加载到内存的。
Step1:
读取文件末尾的4Bytes,得到Hfile format版本号,进而知道Trailer部分的大小, v2和v3都固定为4096Bytes;
Step2:
读取文件末尾的4096Bytes,这部分整体作为一个block,包含一些重要的元数据信息,目前有15个,分为以下几类;
偏移量:loadOnOpenDataOffset、fileinfoOffset、firstDataBlockOffset、lastDataBlockOffset;
数量和大小:totalUncomressedBytes、entryCount、dataIndexCount、metaIndexCount、uncompressedDataIndexSize、numDataIndexLevels
算法:compressionCodec、comparatorClassName、encryptionKey
版本号:majorVersion、minorVersion
其中,fileinfoOffset在v2以后已经没有实际用途
示例:
fileinfoOffset=1231091280,
loadOnOpenDataOffset=1231084052,
dataIndexCount=143,
metaIndexCount=0,
totalUncomressedBytes=4052639474,
entryCount=44722287,
compressionCodec=SNAPPY,
uncompressedDataIndexSize=18657365,
numDataIndexLevels=2,
firstDataBlockOffset=0,
lastDataBlockOffset=1231031083,
comparatorClassName=org.apache.hadoop.hbase.CellComparatorImpl,
encryptionKey=NONE,
majorVersion=3,
minorVersion=3
Step3:
根据loadOnOpenDataOffset读取Root Data Index block,包含numEntries和具体entry数据,每个entry包含offset、dataSize和key;
这里entry所表示的block类型与文件大小有关:
如果文件较小,Trailer中numDataIndexLevels字段的值为1,entry表示的是dataBlock,
如果文件较大,Trailer中numDataIndexLevels字段的值为2,entry表示的是leafIndexBlock
如果文件很大,Trailer中numDataIndexLevels字段的值为3,entry表示的是IntermediaLevelIndexBlock
较大和很大的阈值分别大约为100M和100G,该阈值与key长度和block大小相关;
读取分为2步:先读header(固定33字节),再根据header里面onDiskSizeWithoutHeader的值读取data部分;
这里在读取data时有个优化,会额外多读取一个header大小的数据,目的是使下一个block的读取可以一步完成,减少一次io交互,后续几个block的读取都是如此;
另外,该block末尾还存储了几个值,用于split时快速找到splitPoint:midLeafBlockOffset、midLeafBlockOnDiskSize、midKeyEntry;
Step4:
读取FileInfo该block以键值对的方式存储了一些元数据,读取之后内存中以Map形式存在,作为对比,Trailer内部只存储值,以位置顺序区分不同属性;
另外,这部分没有大小限制,可以根据需要灵活扩展,当前版本存储的属性示例如下;
BLOOM_FILTER_TYPE = ROW DELETE_FAMILY_COUNT = 0 EARLIEST_PUT_TS = 1479619233886 KEY_VALUE_VERSION = 1 LAST_BLOOM_KEY = 69993111f5d1dfa4179d9f278192a0ad MAJOR_COMPACTION_KEY = true MAX_MEMSTORE_TS_KEY = 15986682 MAX_SEQ_ID_KEY = 15986682 TIMERANGE = 1479619233886....1577672100675 hfile.AVG_KEY_LEN = 73 hfile.AVG_VALUE_LEN = 5 hfile.CREATE_TIME_TS = 1577728182220 hfile.LASTKEY = 69993111f5d1dfa4179d9f278192a0ad/tag:userkn_zhengxin_list/1575836971202/Put/vlen=0/mvcc=0
Step5:
读取General BloomFilter Meta And Index
BloomFilter block的index固定只有一层,结构与RootDataIndex 类似;
meta部分额外包含了几个与bloom相关的算法和统计信息:totalByteSize、hashCount、hashType、totalKeyCount、totalMaxKeys;
Step6:
读取DeteleFamily BloomFilter Meta And Index
该block结构与General BloomFilter一致;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
HBase rpc框架介绍
概述 总体结构如下: 客户端 模块介绍 调度执行 该模块主要提供接口转换、错误重试、服务分组等能力; 1:接口转换 服务层定义的服务接口与用户层不同,比如put/delete/increment/append等操作底层都是调用的mutate接口,而batch相关的操作,无论是读还是写都调用multi接口; 转换逻辑封装为一个callable对象,交由RpcRetryingCaller处理; 2:错误重试 RpcRetryingCaller负责与服务代理模块直接交互 ,以及错误时的重试; 3:服务分组 batch相关的操作可能会涉及到多个rs,需要按照rs进行分组,然后多线程并发请求,这些逻辑是在AsyncProcess中; 对于非batch类请求则直接使用RpcRetryingCaller进行调用,AsyncProcess的内部实际上也是依赖了该类来执行单个rs请求; 服务代理 服务代理通常叫stub,即桩的意思,其实现了与服务端同样的接口;对调度执行模块而言,调用stub的方法就相当于调用远程的服务,而不必关心实现细节; 这部分依赖protobuf组件,通过在proto文件中定义se...
- 下一篇
调度参数在MaxCompute的使用
一、调度参数和MaxCompute的关系 首先明确调度参数是属于DataWorks上的和MaxCompute之间是没有关系的。 二、调度参数执行的原理 调度参数是经过DataWorks的调度系统进行解析,然后将解析的值传到MaxCompute上MaxCompute根据对应的key获取对应的value,所以想要取到值必须经过DataWorks的调度系统解析。 三、如何测试调度参数 1.系统参数(2个) • 主要包括业务时间bdp.system.bizdate• 定时时间bdp.system.cyctime说明:这两个值由于是DataWorks的系统参数,可以直接在代码中使用,在页面点击高级运行可以解析。**使用方法:**在DataWorks直接点击高级运行可以看到结果 select ${bdp.system.bizdate} 结果: 2.时间参数 内置
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8