HBase flush
来源:互联网 发布:java extends super 编辑:程序博客网 时间:2024/05/16 17:52
flush触发方式
1. Server端执行更新操作(put、delete、multi(MultiAction<R>multi)、(private)checkAndMutate、mutateRow (byte[] regionName, RowMutations rm))执行前后触发内存检查
- 操作执行前
MemStoreFlusher .reclaimMemStoreMemory,如果regionserver使用memstore大于upper,则循环创建flush任务加入flushQueue,每次循环sleep5秒钟,这种检查是调用flushOneForGlobalPressure的flush
- 操作执行前
HRegion. checkResources(),如果当前region的memstore大于flushsize * multiplier,则循环调用requestFlush(),每次循环sleep(hbase.server.thread.wakefrequency),否则直接返回。
- 执行操作HRegion的internal*
- 执行操作后
如果当前region达到flushsize,则触发requestFlush() 生成FlushRegionEntry包含当前region信息并加入flushQueue进行对指定region的flush。
所有执行flush操作的过程都是通过MemStoreFlusher的flushRegion完成。
HRegion.flushRegion过程
1. 判断文件数是否达到block要求hbase.hstore.blockingStoreFiles
如果达到的话,判断是否超过block时长hbase.hstore.blockingWaitTime
如果已经超过,则执行HRegion.flushcache()
如果没有超时
并且是第一次进入queue,则检查是否执行split和compact。
否则重新加入flushQueue延迟blockingWaitTime/100
2. 执行
HRegion.flushcache()->HRegion.internalFlushcache()
执行完成后再检查一次是否需要split和compact
HRegion.internalFlushcache过程
1. 为Region下的每个store创建一个StoreFlusherImpl
2. 为memstore生成snapshot,实际就是把集合赋值给flusher的内部集合,然后给memstore重新new一个集合。
3. Store. internalFlushCache,生成memstoreScanner将数据通过StoreFile.Writer写成HFile
MemStoreFlusher周期性检查flushQueue,触发队列的region flush或者根据内存使用情况选择region来进行flush。
如果queue为空并且server内存使用高于lower的限制,则调用flushOneForGlobalPressure flush一个region。
flushOneForGlobalPressure
首先找到如下2个region
bestFlushableRegion:选择内存使用最大且文件数未达到compact block文件数限制的region,并且没有在flush队列中region。
bestAnyRegion:选择内存使用最大,不管文件数是否达到compact block文件数限制的region,并且没有在flush队列中region。
这俩中再二选一,策略如下
if (bestFlushableRegion != null &&
bestAnyRegion.memstoreSize.get() > 2 * bestFlushableRegion.memstoreSize.get()) {
regionToFlush = bestAnyRegion;
}else {
if (bestFlushableRegion ==null) {
regionToFlush = bestAnyRegion;
}else {
regionToFlush = bestFlushableRegion;
}
}
选择好region后进行flush完成后返回。如果失败的话则会选择其他region flush。
如果queue不为空,则从queue中poll一个region flush。
最后一种触发flush的方式是client端执行HBaseAdmin.flush(HRegionInfo regionInfo)
这种方式会判断client端flush的表名还是region名
如果是region,则调用HRegionServer的flushRegion(HRegionInfo regionInfo)
如果是表名,则通过MetaReader获取此表的所有region,循环flush
- HBase flush
- [HBase]Flush
- HBase Memstore Flush
- hbase flush 数据
- HBase flush issue
- HBase Flush 解析
- HBase之MemStore flush流程
- HBase 0.1.0 Flush流程源码分析
- HBase – Memstore Flush深度解析
- HBase中MemStore flush的源码解析
- flush ()
- flush( )
- flush
- flush()
- HBase Region操作实战分析之Mem Flush
- HBase Flush操作流程以及对读写服务的影响
- HBase Flush操作流程以及对读写服务的影响
- hbase 源代码分析 (13) memStore flush to HFile
- 黑马程序员——内省、类加载器、动态代理
- VC++文件夹的创建和文件夹的删除总结
- iBatis中的重要接口SqlMapClient
- Spring+Ibatis集成开发实例
- Servlet 3.0笔记之超方便的文件上传支持
- HBase flush
- SQL中UNION使用实例
- Eclipse 编辑器字体设置(Java/C/C++等均适用)
- MFC对话框实现模糊c均值聚类算法
- git_vs_github入门
- 国嵌——内核驱动——第二天(总线-驱动-设备模型)
- (转)Android Bander设计与实现 - 设计篇
- 【第二弹】OpenGL深入学习之缓冲区
- Java中堆内存和栈内存详解