HBase-0.95.1源码分析之split
split操作执行的是将HBase中较大的Region分为两个。因为split比较耗时,因此split是在独立的线程中完成的,相关类是CompactSplitThread。
首先,CompactSplitThread中分区的方法主要是以下两个:
CompactSplitThread.requestSplit(HRegion):检测是否需要分区,如果需要分区则调用requestSplit(HRegion, byte[])
CompactSplitThread.requestSplit(HRegion, byte[]):执行分区操作<用户手动分区调用的也是该方法>
CompactSplitThread.requestSplit(HRegion r):
1> CompactSplitThread.shouldSplitRegion():《hbase.regionserver.regionSplitLimit,区域数超过该值则不再进行分区》
2> HRegion.checkSplit():调用的是RegionSplitPolicy.shouldSplit()
分区策略类的配置属性为:
hbase.regionserver.region.split.policy:IncreasingToUpperBoundRegionSplitPolicy<0.94版本之前默认为ConstantSizeRegionSplitPolicy>
IncreasingToUpperBoundRegionSplitPolicy类中shouldSplitRegion()方法首先根据当前分区所属表的分区数计算实际上用于确定是否需要分区的上限大小:
< long sizeToCheck = tableRegionsCount == 0 ? getDesiredMaxFileSize() : Math.min(getDesiredMaxFileSize(), this.flushSize * tableRegionsCount * tableRegionsCount);>
0.94版本之前是存储文件大小的上限是<hbase.hregion.max.filesize=10G:一个区域的某个列族所有HStoreFile总大小,超过则进行分区>,只有达到了该上限才会进行分区。
如果分区中某一个store(列族)的所有存储文件大小大于以上限制,则判断为需要分区。
方法具体内容如下:
@Override
protected boolean shouldSplit() {
if (region.shouldForceSplit()) {
return true;
}
boolean foundABigStore = false;
// Get count of regions that have the same common table as this.region
int tableRegionsCount = getCountOfCommonTableRegions();
// Get size to check
long sizeToCheck = getSizeToCheck(tableRegionsCount); for (Store store : region.getStores().values()) {
// If any of the stores is unable to split (eg they contain reference files) then don't split
if (!store.canSplit()) {
return false;
} // Mark if any store is big enough
long size = store.getSize();
if (size > sizeToCheck) {
IncreasingToUpperBoundRegionSplitPolicy.LOG.debug("ShouldSplit because " + store.getColumnFamilyName() + " size=" + size + ", sizeToCheck=" + sizeToCheck + ", regionsWithCommonTable=" + tableRegionsCount);
foundABigStore = true;
break;
}
}
return foundABigStore;
}
分区过程调用堆栈如下:
1> CompactSplitThread .requestSplit(HRegion r, byte[] midKey):
this.splits.execute(new SplitRequest(r, midKey, this.server));
SplitTransaction.prepare()
SplitTransaction.execute(Server, RegionServerServices)
createDaughters(Server, RegionServerServices)
1> 关闭父区域并从在线区域列表中移除
2> 对父区域的HStoreFile进行split操作
3> 创建子女区域
4> 元数据修改
openDaughters(Server, RegionServerServices, HRegion, HRegion)
split触发时机:
1> compact之后会调用CompactSplitThread.requestSplit(HRegion)
2> flush之前会检测区域中HStoreFile数目是否超过hbase.hstore.blockingStoreFiles,如果超过且没有等待超时会调用CompactSplitThread.requestSplit(HRegion)
3> flush之后会调用HRegion.checkSplit()检测是否需要split,如果需要则调用CompactSplitThread.requestSplit(HRegion)
HBase-0.95.1源码分析之split的更多相关文章
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- Android7.0 Phone应用源码分析(一) phone拨号流程分析
1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...
- Android7.0 Phone应用源码分析(三) phone拒接流程分析
本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...
- Hbase WAL线程模型源码分析
版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...
- Backbone.js 0.9.2 源码分析收藏
Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富A ...
- Android 7.0 Gallery图库源码分析1 - 初识Gallery源码
分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity. <activity ...
- Android7.0 拨号盘应用源码分析(一) 界面浅析
前言 android拨号盘的源码目录在package/app/Dialer 自7.0以后Incallui的源码直接放到了Dialer目录下,虽然在7.0以前incallui有自己独立的目录,但实际编译 ...
随机推荐
- mongodb gridfs基本使用
Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径. 目前需 ...
- CSS 让 fontawesome 图标字体变细
一句 CSS 让 fontawesome 图标字体变细 自从 iOS 某个版本发布之后,前端的流行趋势是什么都越来越细…字体越来越细…图标线条也越来越细.而老物 fontawesome 粗壮的线条风格 ...
- ASP.NET Request.Cookies获取某个Cookie的奇怪问题
公司的某个产品依赖一个Cookie的值,发现在某些情况下即使Request附带了该Cookie(通过Fiddler2监控),服务器端通过HttpContext的Request.Cookies访问该Co ...
- probing privatePath如何作用于ASP.NET MVC View
当View上using一些从probing privatePath加载的程序集,运行时会提示无法找到对应程序集. <runtime> <assemblyBinding xmlns=& ...
- WORD Application.Documents.Open函数返回null的一种解决方法
DCOM Config Setting for "Microsoft Office Word 97 - 2003 Document" 内部配置一切正常,但调用Application ...
- javaAgent 参数
-javaagent 这个JVM参数是JDK 5引进的. Java -help的帮助里面写道: -javaagent:<jarpath>[=<options>] load Ja ...
- node path的几个路径问题
__dirname: 总是返回被执行的 js 所在文件夹的绝对路径 __filename: 总是返回被执行的 js 的绝对路径 process.cwd(): 总是返回运行 node 命令时所在的文件夹 ...
- CBV流程之View源码解析
CBV是基于反射实现根据请求方式不同,执行不同的方法. 请求流程:view源码解析 1.urls.py :请求一定来执行视图下的as_view方法.也可以直接点击as_view()来找源码. 2.vi ...
- HDU-1003 Max Sum(动态规划,最长字段和问题)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- linux:任务计划crontab
crontab 简介 crontab 命令常见于 Unix 和类 Unix 的操作系统之中(Linux 就属于类 Unix 操作系统),用于设置周期性被执行的指令. crontab 命令从输入设备读取 ...