HBase 加载Hfile时的读取过程

简介: Hfile分为4部分,其中loadOnOpen section 和trailer这2部分是open file时就会加载到内存的,本文简述其读取步骤。

Hfile分为4部分,其中loadOnOpen section 和trailer这2部分是open file时就会加载到内存的。

hfile_

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一致;

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
分布式计算 Java Hadoop
|
存储 分布式数据库 索引
|
存储 缓存 分布式数据库
|
分布式计算 分布式数据库 Hbase
hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,于是想到“非mapreduce生成Hfile,然后导入hbase当中”。
1797 0
|
Java Shell Hbase
Impala之加载HBase数据
        Impala如何加载HBase数据?本文将为大家进行详细介绍Impala加载HBase数据的步骤。         第一步:HBase创建表(或选择已有表)         HBase shell命令行执行命令: create 'impala_hbase_test...
1791 0
|
4月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
82 0
|
8月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
140 0
|
4月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
53 0