HFile文件结构
首先要了解下它,才能知道它是怎么查找的。
如上图:
HFile分为四部分(针对HFile v2)
- Trailer 我理解它就是一个类似于文件头的东西,存储一些HFile的基本信息,比如版本号,各个块的偏移量
- Load-on-open section 启动时会将它存入内存,保存一些一级索引的数据
- No-Scanned block section 理解它为二级索引即可
- scanned block section 理解它为三级索引加数据即可
构建索引
根据上图中的root data index --> intermediate index —> leaf index构建一个三级索引
每级索引的结构有些不相同但是都是在索引块存储了对应的指向block (可能是索引可能是数据)
- block的地址偏移量
- block的大小
- block的首个key
由于hbase都是保证数据在内存中是有序的然后刷进文件了,那么文件也是有序。
所以偏移量和首个key那么就可以在索引树上每一层都使用二分法进行搜索然后在数据块上找到最终的数据。
注意:在每一层索引上使用二分,最后一层是数据与索引块交替出现的
如下图:
三种类型的block
HFile的最基础的逻辑块就是block
它可以存储索引,也可以存数据,也可以存布隆过滤器的bit数组
下面就不细讲了,去看原文吧
上图:
Trailer
从图中可以看出,如果是定位最后一个或者第一个数据块那么是不走索引的,直接就到了数据块
Data Block
hbase中最基础的 KV对就是这样,value就是简单的二进制流
Bloom Block
图中Bloom Block存储的是通过hash得到的bit数据,详细了解请先看bloom过滤器的原理
root index block
MidKey表示HFile所有Data Block中中间的一个Data Block,用于在对HFile进行split操作时,快速定位HFile的中间位置。