逻辑数据组织格式
- Scanned block section:表示顺序扫描HFile时(包含所有需要被读取的数据)所有的数据块将会被读取,包括Leaf Index Block和Bloom Block;
- Non-scanned block section:HFile顺序扫描的时候该部分数据不会被读取,主要包括Meta Block和Intermediate Level Data Index Blocks两部分;
- Load-on-open-section:这部分数据在HBase的region server启动时,需要加载到内存中。包括FileInfo、Bloom filter block、data block index和meta block index等各种索引的元数据信息;
- Trailer:这部分主要记录了HFile的基本信息、各个部分的偏移值和寻址信息。
- Data Block:主要存储用户的key,value信息
- Meta Block:记录布隆过滤器的信息
- Root Data Index:DataBlock的根索引以及MetaBlock和Bloom Filter的索引
- Intermediate Level Index:DataBlock的第二层索引
- Leaf Level Index:DataBlock的第三层索引,即索引数的叶子节点
- Fileds for midKey:这部分数据是Optional的,保存了一些midKey信息,可以快速地定位到midKey,常常在HFileSplit的时候非常有用
- MetaIndex:即meta的索引数据,和data index类似,但是meta存放的是BloomFilter的信息
- FileInfo:保存了一些文件的信息,如lastKey,avgKeylen,avgValueLen等等
- Bloom filter metadata:是布隆过滤器的索引
物理数据结构图:
数据的读取
- Client访问zookeeper,获取hbase:meta所在RegionServer的节点信息
- Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey查询出RowKey所在的Region的相关信息(Region所在RegionServer)
- Client访问RowKey所在Region对应的RegionServer,发起数据读取请求
- 读取memstore中的数据,看是否有key对应的value的值
- 不管memstore中有没有值,都需要去读取Hfile中的数据(再读取Hfile中首先通过索引定位到data block)
- 判断cache block中中是否已经加载过需要从文件中读取的bloom block和data block,如果加载过了,就直接读取cache block中的数据,如果没有,就读取文件中的block数据
- 将memstore和Hfile中读取的数据汇总取正确的数据返回给客户端