hbase基本结构 (六) HBase写入流程

109 阅读3分钟

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生成新表。