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的更多相关文章

  1. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  2. Android7.0 Phone应用源码分析(一) phone拨号流程分析

    1.1 dialer拨号 拨号盘点击拨号DialpadFragment的onClick方法会被调用 public void onClick(View view) { int resId = view. ...

  3. Android7.0 Phone应用源码分析(三) phone拒接流程分析

    本文主要分析Android拒接电话的流程,下面先来看一下拒接电话流程时序图 步骤1:滑动按钮到拒接图标,会调用到AnswerFragment的onDecline方法 com.android.incal ...

  4. Android7.0 Phone应用源码分析(四) phone挂断流程分析

    电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...

  5. Hbase WAL线程模型源码分析

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...

  6. Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程

    前面分析Gallery启动流程时,说了传给DataManager的data的key是AlbumSetPage.KEY_MEDIA_PATH,value值,是”/combo/{/local/all,/p ...

  7. Backbone.js 0.9.2 源码分析收藏

    Backbone 为复杂Javascript应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富A ...

  8. Android 7.0 Gallery图库源码分析1 - 初识Gallery源码

    分析一个项目的源代码时,第一件事就是查看清单文件,找到程序入口,我们从Gallery2源码的清单文件中可以看到GalleryActivity是此应用的启动Activity. <activity ...

  9. Android7.0 拨号盘应用源码分析(一) 界面浅析

    前言 android拨号盘的源码目录在package/app/Dialer 自7.0以后Incallui的源码直接放到了Dialer目录下,虽然在7.0以前incallui有自己独立的目录,但实际编译 ...

随机推荐

  1. (转载)JVM实现synchronized的底层机制

    目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...

  2. linux禁止IPv6

    1. 禁止加载IPv6模块 # echo "install ipv6 /bin/true" > /etc/modprobe.d/disable-ipv6.conf 每当系统需 ...

  3. php判断正常访问和外部访问

    php判断正常访问和外部访问 <?php session_start(); if(isset($_POST['check'])&&!empty($_POST['name'])){ ...

  4. 二叉树的实现(Java语言描述)

    实现二叉树   并先序遍历之. package 二叉树的实现; public class BinaryTree<T> { class Node { int value; // 该节点存储的 ...

  5. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  6. Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析

    1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"} ...

  7. vi 撤销操作

    'u' : 撤销上一个编辑操作 'ctrl + r' : 恢复,即回退前一个命令 'U' : 行撤销,撤销所有在前一个编辑行上的操作

  8. SIM900A基站定位调试笔记 -转

    第1步:ATE1 握手并设置回显 第2步:AT+CGMR 查看SIM900的版本信号 第3步:AT+CSQ 查看信号质量 第4步:AT+CREG? 查看GSM是否注册成功 第5步:AT+CGREG?  ...

  9. python中的null值

    在一个没有接口文档的自动化测试中,只能通过抓包及查日志查看发送的信息,其中有一个接口发送的信息如下: enable_snapshot": true, "new_size" ...

  10. Unity3D笔记 模型和角色动画的输出设置