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有自己独立的目录,但实际编译 ...
随机推荐
- codeforces水题100道 第十五题 Codeforces Round #262 (Div. 2) A. Vasya and Socks (brute force)
题目链接:http://www.codeforces.com/problemset/problem/460/A题意:Vasya每天用掉一双袜子,她妈妈每m天给他送一双袜子,Vasya一开始有n双袜子, ...
- Lua中的table构造式(table constructor)
最简单的构造式就是一个空构造式{},用于创建一个空table. 构造式还可以用于初始化数组.例如,以下语句:days = {"Sunday", "Monday" ...
- Jquery 网页转换为图片
/* html2canvas 0.5.0-alpha1 <http://html2canvas.hertzen.com> Copyright (c) 2015 Niklas von Her ...
- 【API设计】RESTful API 设计指南
RESTful API URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作. 例如 . REST描述的是在网络中client和server的一种交互形式:REST本身不 ...
- WP8.1学习系列(第二十六章)——控件模板
在本文中 自定义控件模板示例 指定控件的可视结构. 指定控件的可视行为 使用工具轻松处理主题 控件和辅助功能 了解有关控件默认模板的详细信息 控件模板中的主题资源 相关主题 在 XAML 框架中,如果 ...
- django进阶-modelform&admin action
先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...
- xmapp 404设置
这样做的好处一个是很友好,另一个是对于你的网站会更安全些,如果没设置,别人在你的网址后随便输入一个路径,会显示404错误,并且会显示你的服务器版本号,服务器配置一目了然,为了避免这种情况,可以设置错误 ...
- SharpGL学习笔记(一) 平台构建与Opengl的hello World
(一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...
- Spring web.xml中的配置
转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件application ...
- Unity3D动作资源(AnimatinClip)优化
能做到去掉Scale曲线,降低浮点精度 using System; using UnityEngine; using System.Collections; using System.Collecti ...