hbase region split and merge details

一、Region 概念

Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:

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)

Region 大小

Region的大小是一个棘手的问题,需要考量如下几个因素。

  • Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上,但并不是存储的最小单元。
  • Region由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile 组成。memStore存储在内存中, StoreFile存储在HDFS上。
  • HBase通过将region切分在许多机器上实现分布式。
  • region数目太多就会造成性能下降,对于同样大小的数据,700个region比3000个要好。
  • region数目太少就会妨碍可扩展性,降低并行能力。有的时候导致压力不够分散。
  • RegionServer中1个region和10个region索引需要的内存量没有太多的差别。

最好是使用默认的配置,可以把热的表配小一点(或者受到split热点的region把压力分散到集群中)。如果你的cell的大小比较大(100KB或更大),就可以把region的大小调到1GB。region的最大大小在hbase配置文件中定义:

<property> <name>hbase.hregion.max.filesize</name> <value>20 * 1024 * 1024 * 1024</value> </property>

说明:

当region中的StoreFile大小超过了上面配置的值的时候,该region就会被拆分,具体的拆分策略见下文。

上面的值也可以针对每个表单独设置,例如在hbase shell中设置:

create 't','f' disable 't' alter 't', METHOD => 'table_att', MAX_FILESIZE => '134217728' enable 't'

二、自动分区

一张表初始时只有一个region,用户开始向表中插入数据时,系统检查这个region的大小,确保其不超过配置的最大值,如果超过了限制,系统会在中间键(region 中间的那个行键)处将这个region拆分成两个大致相等的子region

三、分裂详细过程

Region自动切分是HBase能够拥有良好扩张性的最重要因素之一。HBase系统中Region自动切分是如何实现的?这里面涉及很多知识点,

比如:

(1)Region切分的触发条件是什么?

(2)Region切分的切分点在哪里?

(3)如何做好切分过程中的异常处理?

(4)切分过程中要不要将数据移动?

接下来我会对这些细节进行基本的说明,可以让大家对HBase中Region自动切分有更加深入的理解

1、region拆分策略选择

在最新稳定版(1.2.6)中,HBase已经有多达6种切分触发策略,包括:

(1)ConstantSizeRegionSplitPolicy:0.94版本前默认切分策略。

(2)IncreasingToUpperBoundRegionSplitPolicy : 0.94版本~2.0版本默认切分策略

(3)SteppingSplitPolicy: 2.0版本默认切分策略

(4)DisableSplitPolicy

(5)KeyPrefixRegionSplitPolicy

(6)DelimitedKeyPrefixRegionSplitPolicy

在这我就只列下我们线上选择的分裂策略,线上hbase用的是1.2.5版本,分裂策略选 择的是IncreasingToUpperBoundRegionSplitPolicy ,而IncreasingToUpperBoundRegionSplitPolicy根据公式min(r^2*flushSize,maxFileSize)确定split的maxFileSize,其中r为在线region个数,maxFileSize由hbase.hregion.max.filesize指定,线上设定为20G。这里假设flushSize为256M:

第一次拆分大小为:min(20G,1*1*256M)=256M 第二次拆分大小为:min(20G,3*3*256M)=2304M 第三次拆分大小为:min(20G,5*5*256M)=6400M 第四次拆分大小为:min(20G,7*7*256M)=12544M 第五次拆分大小为:min(20G,9*9*256M)=20G 第五次拆分大小为:min(20G,11*11*256M)=20G

可以看到,只有在第五次之后的拆分大小才为20G

2、region拆分过程

(1)写请求被region server处理,region server会先将数据写到称为“memstore”的内存存储系统中。一旦memstore写满,在memstore flush操作时,会查看是否达到拆分条件,达到拆分条件,进行拆分。拆分过程非常快速,因为系统在父region中只为子region创建两个对应的文件。

(2)在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生成reference文件,分别指向父region中对应文件。其中reference文件是一个引用文件,文件内容其实非常简单,主要有两部分构成:其一是切分点 splitkey,其二是一个boolean类型的变量(true或者false),true表示该reference文件引用的是父文件的上半部分(top),而false表示引用的是下半部分 (bottom)。

(3) 关闭parent region:parent region关闭数据写入并触发flush操作,将写入region的数据全部持久化到磁盘。

(4) 父region分裂为两个子region后, 将daughter A、daughter B拷贝到表目录下,形成两个新的region。新的region会被同一个regionServe并行打开,打开过程包括更新.META.表,之后这两个region会上线,并开始服务。同时也会对region中的内容进行合并,合并过程在替换引用文件之前会把父region的存储文件异步重写到两个子region中,以上过程会在子region的.tmp中执行,一旦生成重写文件后,将自动取代引用文件。

(5)父region在子region不存在引用文件的时候,可以被删除,意味着.META.表中的表会被移除,磁盘上的文件会被删除

3、region切分结论

(1)Region切分的触发条件是什么?

当memstore flush操作之前,会查看是否达到拆分条件,达到拆分条件,进行拆分。

触发region切分,切分开始之后的第一件事是寻找切分点-splitpoint。

(2)Region切分的切分点在哪里?

整个region中最大store中的最大文件中最中心的一个block的首个rowkey 

(3)如何做好切分过程中的异常处理?

HBase将整个切分过程包装成了一个事务,意图能够保证切分事务的原子性。整个分裂事务过程分为三个阶段:prepare – execute – (rollback) ,在2.0版本之后,使用HLog存储事务的中间状态,大大减少甚至杜绝RIT现象(出现切分处于中间状态就是RIT现象)

(4)切分过程中要不要将数据移动?

切分过程中只需要创建两个对应的文件

Region 负载均衡

当region分裂之后,RS之间的region数量差距变大时,HMaster便会执行负载均衡来调整部分region的位置,使得每个RS的region数量保持在合理范围之内,负载均衡会引起region的重新定位,使得涉及的region不具备数据本地性,即HFile和region不在同一个DataNode。这种情况会在major compaction 之后得到解决。

四、region merge 意义

1、减少Hfiles数量,查询需要的磁盘寻道次数也会减少,查询更快

2、减少store数量,减少memstore内存占用

3、当存在大量没有数据的region时,执行region的合并来避免region过多,官方建议region数量10~1000,超过会影响hbase效率

1、region merge步骤

客户端发送指令给Master

Master收到指令后将要合并的region移动到指定的RegionServer

Master发送Merge请求给指定的RegionServer执行合并操作

最后将被合并的regions从hbase:meta中删除并添加合并后的region

2、region merge 实例

五、hbase Store File 合并

1、Compaction介绍

         在HBase中,每当memstore的数据flush到磁盘后,就形成一个storefile,当storefile的数量越来越大时,会严重影响HBase的读性能 ,所以必须将过多的storefile文件进行合并操作。Compaction主要起到如下几个作用:

(1)合并文件

(2)清除删除、过期、多余版本的数据

(3)提高读写数据的效率

HBase中实现了两种compaction的方式:minor and major. 这两种compaction方式的区别是:

(1) Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作。

(2)Major操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件。

2 、Compaction执行流程

        在HBase实现中,通过CompactionChecker线程来定时检查是否需要执行compaction,同时每当RegionServer发生一次memstore flush操作之后也会进行检查是否需要进行compaction操作。

Compact检查线程每隔10000秒(hbase.server.thread.wakefrequency可配置)开始检查当前Regionserver下的Region是否需要进行Compact,检查的过程是遍历每个Region,然后遍历该Region下的每个store,然后判断该store是否需要进行Compact,判断的标准是:

(storefiles.size() - filesCompacting.size()) > minFilesToCompact

即:当前store下storefile数量减去正在进行Compact的storefile的数量 大于 minFilesToCompact(可配置)值的时候 需要进行Compact,那么就开启一个CompactSplitThreads线程开始处理。如果上述判断失败,检查线程还会判断是否需要进行major_compact,如果需要,还要根据Compact的优先级开始不同优先级的CompactSplitThreads线程进行处理。

当一个Region的compact过程处理完毕之后,还需要判断是否需要迭代执行Compact,判断的条件是:

this.blockingStoreFileCount <= this.storefiles.size()

blockingStoreFileCount小于等于当前store下storefile的数量时,还需要继续进行compact,即需要将每个的store下的storefile的数量保持在blockingStoreFileCount(hbase.hstore.blockingStoreFiles可配置)以下。

3、Compact参数(2018-07-17)

参数名

含义

默认值

线上配置

hbase.hregion.majorcompaction

majorCompaction自动执行的时间间隔

604800000s(7day)

 

hbase.hstore.compaction.min

(hbase.hstore.compactionThreshold)

触发compaction的参数

3

 

hbase.hstore.compaction.max

每次Compact合并文件数的上限

10

 

hbase.hstore.blockingStoreFiles

store在storefile数量的上限

10

 

hbase.hstore.blockingWaitTime

minor_compaction阻塞data update的时间上限值

90000 ms 

 

hbase.regionserver.thread.compaction.small

smallCompaction线程池的线程数

 

20

hbase.regionserver.thread.compaction.large

largeCompaction 线程池的线程数

 

5

hbase.hstore.compaction.kv.max

compaction过程中,每次从Hfile中读取kv的个数

10

 

hbase.server.thread.wakefrequency

每隔一定时间检查是否需要进行compaction

10000s

 

六、测试验证

1、region 分裂与合并过程中,合并storefile时异步同步数据,不用手动major compuct 操作

***************************PE 自动刷数据********************************

./bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation sequentialWrite 2

******************************************************************************

disable 'TestTable'

alter 'TestTable',{NAME=>'info',TTL=>'2'}

enable 'TestTable'

*******************************查询TestTable数据文件大小******************************

hdfs dfs -du -h /hbase/data/default/TestTable

**********************测试jar命令*****************************

(java -jar operate_user-0.0.1-SNAPSHOT.jar > run_merge_region.log 2>&1 &)

猜你喜欢

转载自blog.csdn.net/qq_34394465/article/details/81167354
今日推荐