hbase region split操作的一些细节,具体split步骤很多文档都有说明,本文主要关注regionserver如何选取split point

首先推荐web ui查看hbase region分布的一个开源工具hannibal,建议用daemontool管理hannibal意外退出,自动重启,之前博文写了博文介绍如何使用daemontool管理

假设有一张hbase的table如下表所示,有一个region的大小比较大,可以对这个region进行手动split操作

HBase的物理存储树状图如下

Table       (HBase table)
Region (Regions for the table)
Store (Store per ColumnFamily for each Region for the table)
MemStore (MemStore for each Store for each Region for the table)
StoreFile (StoreFiles for each Store for each Region for the table)
Block (Blocks within a StoreFile within a Store for each Region for the table)

一种常见的分裂策略是:ConstantSizeRegionSplitPolicy,配置hbase.hregion.max.filesize是指某个store(对应一个column family)的大小

/<hdfs-dir>/<hbasetable>/<xxx(part of region-id)>/<columu-family>

memstore flush到store files时,或者多个store files compact操作时候,会判断是否需要split。
找到最大且不包含reference的store,在这个store下面找到最大的storefile,然后用这个storefile的中间rowkey作为split的点。
RegionSplitPolicy.java
Iterator i$ = stores.values().iterator(); while(i$.hasNext()) {
Store s = (Store)i$.next();
byte[] splitPoint = s.getSplitPoint();
long storeSize = s.getSize();
if(splitPoint != null && largestStoreSize < storeSize) {
splitPointFromLargestStore = splitPoint;
largestStoreSize = storeSize;
}
}
Store.java

public byte[] getSplitPoint() {
long e = 0L;
StoreFile largestSf = null;
Iterator r = this.storefiles.iterator(); StoreFile midkey;
while (r.hasNext()) {
midkey = (StoreFile) r.next();
org.apache.hadoop.hbase.regionserver.StoreFile.Reader mk;
if (midkey.isReference()) {
assert false : "getSplitPoint() called on a region that can\'t split!"; mk = null;
return (byte[]) mk;
} mk = midkey.getReader();
if (mk == null) {
LOG.warn("Storefile " + midkey + " Reader is null");
} else {
long fk = mk.length();
if (fk > e) {
e = fk;
largestSf =
midkey;
}

}
} org.apache.hadoop.hbase.regionserver.StoreFile.Reader r1 = largestSf.getReader();
if (r1 == null) {
LOG.warn("Storefile " + largestSf + " Reader is null");
midkey = null;
return (byte[]) midkey;
} byte[] midkey1 = r1.midkey();
//...略
}

所以split实际上并不是完全的等分,因为split point不一定是数据分布的中位点。

参考:

http://blog.javachen.com/2014/01/16/hbase-region-split-policy.html
http://www.cnblogs.com/niurougan/articles/3975463.html
http://hbase.group.iteye.com/group/topic/40359

HBase如何选取split point的更多相关文章

  1. HBase 分裂(split)

    1. 为什么split 最初一个Table 只有一个region(因此只能存放在一个region server上).随着数据的不断写入,HRegion越来越大,当到达一定程度后分裂为两个,通过负载均衡 ...

  2. HBase(0.94.5)的Compact和Split源码分析

    经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一.       Compact 2.1.   Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...

  3. Hbase split的三种方式和split的过程

    在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的.一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个 ...

  4. HBase Split

    Region Split请求是在Region MemStore Flush之后被触发的: boolean shouldCompact = region.flushcache(); // We just ...

  5. 你想要的 HBase 原理都在这了

    目录 一. 集群架构 集群角色 工作机制 二.存储机制 A. 存储模型 B. LSM 与 Compaction C. Region 分裂 D. 自动均衡 三.访问机制 四. 鉴权 五. 高可靠 1.集 ...

  6. 大白话详解大数据HBase核心知识点,老刘真的很用心(2)

    前言:老刘目前为明年校招而努力,写文章主要是想用大白话把自己复习的大数据知识点详细解释出来,拒绝资料上的生搬硬套,做到有自己的理解! 01 HBase知识点 第6点:HRegionServer架构 为 ...

  7. HBase参数配置及说明

    版本:0.94-cdh4.2.1 hbase-site.xml配置 hbase.tmp.dir 本地文件系统tmp目录,一般配置成local模式的设置一下,但是最好还是需要设置一下,因为很多文件都会默 ...

  8. HBase Java简单示例

    Hbase采用Java实现,原生客户端也是Java实现,其他语言需要通过thritf接口服务间接访问Hbase的数据. Hbase作为大数据存储数据库,其写能力非常强,加上Hbase本身就脱胎于Had ...

  9. HBase参数配置及说明(转)

    版本:0.94-cdh4.2.1 hbase-site.xml配置 hbase.tmp.dir 本地文件系统tmp目录,一般配置成local模式的设置一下,但是最好还是需要设置一下,因为很多文件都会默 ...

随机推荐

  1. 牛顿法|阻尼牛顿法|拟牛顿法|DFP算法|BFGS算法|L-BFGS算法

    一直记不住这些算法的推导,所以打算详细点写到博客中以后不记得就翻阅自己的笔记. 泰勒展开式 最初的泰勒展开式,若  在包含  的某开区间(a,b)内具有直到n+1阶的导数,则当x∈(a,b)时,有: ...

  2. Linux ext3 ext4 区别

    Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4. Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只 ...

  3. 如何扩大LVM 逻辑分区的大小?

    参考: (http://blog.csdn.net/t0nsha/article/details/7296851) LVM (Logical volume management) 执行 df 指令查看 ...

  4. python练手基础

    Python相关文档0.1. Python标准文档0.2. Python实用大全0.3. 迷人的Python0.4. 深入理解Python0.5. Python扩展库网址 http://pypi.py ...

  5. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  6. Two Sum Leetcode Java

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  7. 倾力总结40条常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...

  8. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  9. MySQL分库分表的一些技巧

    分表是分散数据库压力的好方法. 分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库. 当然,首先要知道什么情况下,才需要分表.个人觉得单表记录条数达到百万到千万 ...

  10. Angular2 组件

    1. 组件说明 Angular2 组件是构成Angular2应用程序的核心部分,Angualr2应用程序本质上来说就是一个组件树,Angular2组件一般由模块,注解,元数据以及组件类组成,实现组件类 ...