HBase源码系列之HFile
本文讨论0.98版本的hbase里v2版本。其实对于HFile能有一个大体的较深入理解是在我去查看”到底是不是一条记录不能垮block“的时候突然意识到的。
首先说一个对HFile很直观的感觉,我觉得HFile的整个设计中很重要的一点是为减少内容占用。首先写时候可以把一个个block按顺序写入,满足一个chunk写入一个元数据(包括bloomfilter),最后是一些HFile的元数据。对于HFile,我个人觉得主要把握好几个问题。
- block的组织
- bf和block的关系
- index和block的关系
- 写入顺序和一些基本的元数据信息结构
- 记录能不能跨block
明白这四个问题感觉基本可以大致的描绘出HFile了。
HFileWriterV2
首先,我们知道会引起下HFile的操作有flush和compaction。在此,我们就选择从flush这个入口跟进去看。
在StoreFile中,以下方法主要是为了Store书写到一个HFile中。
|
|
在此方法会调用如下方法
|
|
以下分解append方法
|
|
上面注释中说的那个代码如下
|
|
append下面是一些很正常的数据写入(都是对stream的添加操作),元数据记录(firstKeyInBlock)等。
回到appendGeneralBloomfilter(kv)方法,此方法里面有一个判断是值得注意的。
|
|
在enqueueReadyChunk(false)中有
|
|
然后时间很快就到了close环节。
|
|
block组织也分两类,一个chunk里组织block(他们共生存啊,用了一个bf),另外是root index和intermedia index的组织,实际这个更多感觉是组织chunk。
|
|
ibw.shouldWriteBlock(closing)方法的判断如下,实际是判断是否有chunk
|
|
下面是写入bloom meta index,感觉就是chunk的那些。
|
|
其实还有部分元数据(各种offset和树的生成)没有分析。以后在说吧。
HFileReaderV2
由上述的代码分析来看,其实读取的时候最主要要解决的是是否读此block。决定了读此block之后已经没有太多需要在此文章中分析了,因为那是检索流程的事情(组织memstore和storefile)
- 读block index和bloom filter信息
- 使用这两种索引过滤block
HFileReader主要涉及到的几个方法,包括获取和open。发生在在检索获取scanner和过滤scanner时。
在List
|
|
此方法调用了如下方法。
|
|
接着调用open方法,方法如下
|
|
判断的一个文件是否需要读取时,在伟大的 boolean org.apache.hadoop.hbase.regionserver.StoreFileScanner.shouldUseScanner(Scan scan, SortedSet
|
|
里面会调用一个contains
|
|
在如下方法(感觉时seekTO时,用于scan时指定了开始的rowkey,这样解释就合理了。在reader.passesBloomFilter中有判断是否时scan)中使用block index过滤了。
|
|
CompoundBloomFilter构造方法中读取Block index的数据。