HBase StoreFile原理总结
1. StoreFile是什么
- 在hbase架构设计中,本身hbase基于hdfs进行数据存储。同时为了提升效率,数据会有一个memstore、block cache来做数据缓存,使用wal日志文件来防止内存数据丢失。但最终都会落地到磁盘中,这个磁盘文件就是store file。具体架构可以看我另一篇博客HBase架构原理
- 一个region中会有多个store,按照此前查看hdfs中信息可知,一个列族一个store文件夹,一个列族中会有1到多个HFile(store files)文件
- store file或者说HFile由更小的block组成。block size是基于每个列族进行配置的,数据压缩也是以块为单位。后续会列文讲解一下hdfs中的数据压缩机制和应用。
- HFile,顾名思义,就是hdfs中文件存储的一种格式。包含一个多层索引,允许HBase在不读取整个文件的情况下查找数据,这些索引的大小是块大小(默认64KB)
- 注意,HBase中数据是以key value形式存储,所以如何设计rowkey,以及如何降低rowkey的存储空间都是需要仔细考量的。
- 可以使用hbase自带命令查看HFile
hbase hfile -p -f /hbase/data/default/t1/157b4ab800b1d9c89a2e3b22fc511a46/base_info/9ad461c1c4bc47b7a4a772644578c145
2.HFile
2.1 HFile组成
,也可以查看官网文档中说明 hbase doc
2.2 HFile内部block
- block是 hbase存储的最小单元,HFile只是block之上的一种抽象或者包装。而为了提高IO效率,region server又基于LRU(最近最少淘汰算法)进行block 的cache机制设计。
- 每个block块的大小可以izai创建table的时候通过参数设置,否则默认是64kb。
- 显而易见,大号的block有利于顺序scan,因为关联的数据都会在一个block中。小号的block有利于随机查询
- 组成截图,这里参考官网截图。每个block块中,除了开头的magic魔数之外(一个随机数字,为了防止数据损坏,真的损坏了,也只是随机数字修改了而不是真实存储的数据修改了。实际中数据开头是容易在读写操作中损坏的)
- Data Block 段–保存表中的数据,这部分可以被压缩
- Meta Block 段 (可选的)–保存用户自定义的kv对,可以被压缩。
- File Info 段–Hfile的元信息,不被压缩,用户也可以在这一部分添加自己的元信息。
- Data Block Index 段–Data Block的索引。每条索引的key是被索引的block的第一条记录的key。
- Meta Block Index段 (可选的)–Meta Block的索引。
- Trailer记录了HFile的基本信息,保存了上述每个段的偏移量(即起始位置)[索引].
Trailer–这一段是定长的保存了每一段的偏移量,读取一个HFile时,会首先 读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。