HBase flush
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 Flush机制最小Flush单元为HRegion,尽量减少CF数量以减少HStrore数量从而减少MemStore的数量,最终减少每次Flush的开销.1.Region级别触发条件: ...
- Hbase flusher源码解析(flush全代码流程解析)
版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明. 在介绍HBASE flush源码之前,我们先在逻辑上大体梳理一下,便于后续看代码.flush的整体流程分三个阶段 1.第一 ...
- HBase 入门之数据刷写(Memstore Flush)详细说明
接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系).HBase 写数据(比如 put.delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写 ...
- HBase:Shell
HBase shell commands As told in HBase introduction, HBase provides Extensible jruby-based (JIRB) she ...
- HBASE SHELL 命令使用
HBASE SHELL命令的使用 在hbase shell客户端有许多的操作命令,今天回顾并且总结一二,希望和广大读者共同进步,并且悉心聆听你们的意见.在此的hbase版本是:HBase 1.2.0- ...
- HBase 数据迁移方案介绍
一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分为以下几类: 图1.HBase数据迁移方案 从上面图中可看出,目前的方案主要有四类,Hadoop层有一类,HBase层有三类.下 ...
- HBase 数据迁移方案介绍 (转载)
原文地址:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...
- HBase操作(Shell与Java API)
版权声明:本文为博主原创文章,未经博主允许不得转载. 转: http://blog.csdn.net/u013980127/article/details/52443155 下面代码在Hado ...
- 从hbase到hive,以及sqoop转到mysql解析
https://blog.csdn.net/qq_33689414/article/details/80328665 hive关联hbase的配置文件 hive和hbase同步https://cwik ...
随机推荐
- 浅谈SSH框架
在学习或者接触一个新的概念的时候,我们应该在脑海中发挥我们的搜索引擎,牵一发动全身的去想,这个知识跟我之前接触过的有哪些相同或者不同的地方,从这个角度去看那些新的知识和概念,经过旧知识和新知识的对比我 ...
- Android初级教程:Android中解析方式之pull解析
在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...
- 【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50163725 一. 分段控件 (UISegmentedControl) 控件展 ...
- tomcat配置集群
在Tomcat中使用集群功能相对简单.最简单的用法是直接在server.xml文件的或节点下添加 <Cluster className="org.apache.catalina.ha. ...
- (一一〇)正则表达式的基本使用与RegexKitLite的使用
正则表达式常常用于匹配关键字,下面先介绍基本语法. [基本语法] ①中括号表示满足其中之一即可,例如[abc],则这个位置可以是a.b.c中任意一个. ②在中括号中,可以通过-连接范围,例如a-z:多 ...
- UNIX网络编程——TCP 滑动窗口协议
什么是滑动窗口协议? 一图胜千言,看下面的图.简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口.发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大, ...
- Android 基于MVC的MVVM模式开发
由skay整理 http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...
- Socket编程实践(13) --UNIX域协议
UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答 ...
- Android项目-高考作文-使用ORMLite抽象公共的Dao层
1, 定义统一的Dao接口 public interface IDao<T> { public abstract T getSingleById(int id); public abstr ...
- Android自定义Button的“款式”
要想让你的button呈现出一种不一样的外观,一般会采取以下两种形式 采用selector里面加图片的方式 采用selector用shape进行代码控制的方式 对第一种方式而言,只需要注意好" ...