1. 整体流程
2. 组件交互图
3. Region写入流程
4. HLog写入模型
5. KV数据写入HFile
构建Bloom Block:
1)cell写进来之后,首先判断当前chunk是否已满。
2)如果超过阈值,会重新申请一个新的chunk,并将当前chunk放入ready chunks集合中。
3)如果未超阈值,则根据布隆过滤器算法使用多个hash函数分别对cell的rowkey进行映射,将相应位置1。
构建Data Block:
1) Encoding KeyValue 使用特定编码对cell进行处理:DiffKeyDeltaEncoder, FastDiffDeltaEncoder, PrefixKeyDeltaEncoder… 编码基本思路: 根据上一个KeyValue和当前KeyValue比较后取delta,也就是分别比较rowkey, column family, columns然后取delta。 假如前后两个KeyValue的rowkey相同,当前rowkey就可以使用特定的一个flag标记,不需要再完整地存储整个rowkey,减少存储空间。
2)将编码后的KeyValue写入DataOutputStream 随着cell不断写入,当前Data Block超过阈值(默认64K),将DataOutputStream的数据flush到文件,完成落盘。
构建Leaf Index Block:
1)Leaf Index Block会随着Leaf Index Entry写入慢慢变大,一旦超过阈值(64K),需要flush到文件落盘。
2)Leaf Index Block落盘是追加写入文件,会形成HFile中Data Block, Leaf Index Block交叉出现的情况。
3)Leaf Index Block落盘后需要向上构建Root Index Entry并写入Root Index Block,形成索引树的根节,但根节点不追加写入Scanned block,而是最后写入Load-on-open。
构建Bloom Index Block:
1)完成Data Block落盘后,检查是否已写满Bloom Block。
2)如果写满,将Bloom Block追加写入文件,在内存中构建一个Bloom Index Entry,并写入Bloom Index Block。 查找流程: Root Index Block -\> Leaf Index Block 二分查找定位Data Block -\> 加载Data Block到内存进行遍历。**
**KV数据写入HFile流程总结:
1)首先构建Bloom Block, Data Block。
2)一旦写满一个Data Block,将其落盘同时构建一个Leaf Index Entry,写入Leaf Index Block,直至写满落盘。
3)每写入一个KeyValue就会动态构建Scanned Block部分,等所有KeyValue都写入完成后再静态构建Non-scanned Block, Load on open,Trailer部分。
6. BulkLoad工作流程
应用场景: 1. 两个集群互为主备,通过备份集群修改异常集群: 把备份集群的数据导一个快照拷贝到异常集群,然后通过CopyTable工具扫描快照生成Hfile, 最后bulkload到异常集群,完成数据修复。 2. 用户写入大量数据后,发现选择的split keys不合适: 通过Snapshot生成HFile再bulkload生成新表。