原文地址:https://cloud.tencent.com/developer/article/1374592

HBase自定义拆分策略

自定义拆分策略

您可以使用自定义RegionSplitPolicy(HBase 0.94+)重写默认拆分策略。通常,自定义拆分策略应该扩展HBase的默认拆分策略: IncreasingToUpperBoundRegionSplitPolicy。

该策略可以通过HBase配置或者也可以基于每个表在全局范围内进行设置。

在hbase-site.xml中全局配置拆分策略:

<property><name>hbase.regionserver.region.split.policy</name><value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>

使用Java API在表上配置拆分策略:

HTableDescriptor tableDesc = new HTableDescriptor("test");
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, ConstantSizeRegionSplitPolicy.class.getName());
tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
admin.createTable(tableDesc);
----

使用HBase Shell在表上配置拆分策略:

hbase> create 'test', {METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy'}},{NAME => 'cf1'}

该策略可以通过使用的HBaseConfiguration或按表进行全局设置:

HTableDescriptor myHtd = ...;
myHtd.setValue(HTableDescriptor.SPLIT_POLICY, MyCustomSplitPolicy.class.getName());

DisabledRegionSplitPolicy策略阻止手动区域拆分。

HBase-2.x支持7种Region自动拆分Region的策略,类图如下:

其中BusyRegionSplitPolicy是HBase-2.x新增的策略,其他6种在HBase-1.2.x中也可以使用。

设置自动拆分策略的关键配置如下:

hbase.regionserver.region.split.policy
description: Region自动拆分的策略
default: HBase-1.2.x: org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicyHBase-2.x: org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy
option: org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicyorg.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicyorg.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicyorg.apache.hadoop.hbase.regionserver.SteppingSplitPolicyorg.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicyorg.apache.hadoop.hbase.regionserver.DelimitedKeyPrefixRegionSplitPolicyorg.apache.hadoop.hbase.regionserver.BusyRegionSplitPolicy (HBase-2.x Only)

配置方法:

  • 在hbase-site.xml中配置,例如:
<property> <name>hbase.regionserver.region.split.policy</name>  <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>
  • 在HBase Configuration中配置
private static Configuration conf = HBaseConfiguration.create();
conf.set("hbase.regionserver.region.split.policy", "org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy");
  • 在创建表的时候配置 Region的拆分策略需要根据表的属性来合理的配置,所以建议不要使用前两种方法来配置拆分策略,关于在建表的时候怎么配置,会在下面解释每种策略的时候说明。

接下来将详细介绍这7种Region自动拆分的策略。

1. ConstantSizeRegionSplitPolicy

策略描述

这种策略非常简单,只要Region的大小达到了hbase.hregion.max.filesize所定义的大小,就进行拆分。

相关参数

hbase.hregion.max.filesize
default: 10737418240 (10GB)
description: 当一个Region的容量达到这个配置定义的大小后,就会拆分Regionhbase.server.thread.wakefrequency
default: 10000 (10s)
description: 检测Region的大小是否超过限制的时间间隔

拆分效果

经过这种策略的拆分后,Region的大小是均匀的,例如一个10G的Region,拆分为两个Region后,这两个新的Region的大小是相差不大的,理想状态是每个都是5G。

设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf("tableName"));tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy");
// 以下配置根据需要配置或者不配置
tableDesc.setMaxFileSize(1048576000);tableDesc.addFamily(...)
admin.createTable(tableDesc);

2. IncreasingToUpperBoundRegionSplitPolicy

策略描述

这种拆分策略是HBase-1.2.x的默认使用的拆分策略,Region的前几次拆分的阈值不是固定的数值,是需要进行计算得到,计算过程在源码中说明。

相关配置

hbase.hregion.memstore.flush.size
default: 134217728 (128MB)
description: 如果Memstore的大小超过这个字节数,它将被刷新到磁盘.hbase.increasing.policy.initial.size
default: none
description: IncreasingToUpperBoundRegionSplitPolicy拆分策略下用于计算Region阈值的一个初始值

设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf("tableName"));tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy");
// 以下配置根据需要配置或者不配置
tableDesc.setValue("hbase.increasing.policy.initial.size", "1048576000");
tableDesc.setMaxFileSize(1048576000);
tableDesc.setMemStoreFlushSize(1048576000);tableDesc.addFamily(...)
admin.createTable(tableDesc);

拆分效果

均匀拆分

3. KeyPrefixRegionSplitPolicy

策略描述

除了简单粗暴地根据大小来拆分,我们还可以自己定义拆分点。KeyPrefixRegionSplitPolicy是IncreasingToUpperBoundRegionSplitPolicy的子类,在前者的基础上增加了对拆分点(splitPoint,拆分点就是Region被拆分处的rowkey)的定义。它保证了有相同前缀的rowkey不会被拆分到两个不同的Region里面。

相关配置

KeyPrefixRegionSplitPolicy.prefix_length# 注意,有的博客中这个配置是
# prefix_split_key_policy.prefix_length
# 这个配置在HBase-1.2.x版本中已经标志为 Deprecated

以上参数指定了在rowkey中,取前几个字符作为前缀,例如这个设置这个值为5,那么在rowkey中,如果前5个字符是相同的,拆分后也一定会在一个Region中。

拆分效果

  • 普通的拆分

  • 按照Rowkey前缀拆分

    设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameStr));
tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy");
tableDesc.setValue("KeyPrefixRegionSplitPolicy.prefix_length", "5");// 以下配置根据需要配置或者不配置
tableDesc.setValue("hbase.increasing.policy.initial.size", "1048576000");
tableDesc.setMaxFileSize(1048576000);
tableDesc.setMemStoreFlushSize(1048576000);tableDesc.addFamily(...)
admin.createTable(tableDesc);

说明

KeyPrefixRegionSplitPolicy是IncreasingToUpperBoundRegionSplitPolicy类的子类,就是按照rowkey的前缀去拆分Region,但是什么时候拆分,原Region容量的最大值是多少还是需要使用IncreasingToUpperBoundRegionSplitPolicy的方法去计算。SteppingSplitPolicy、DelimitedKeyPrefixRegionSplitPolicy、BusyRegionSplitPolicy (HBase-2.x Only),他们获取Region的拆分阈值的方式都是继承自IncreasingToUpperBoundRegionSplitPolicy。

适用场景

如果你的所有数据都只有一两个前缀,那么采用默认的策略较好。 如果你的前缀划分的比较细,你的查询就比较容易发生跨Region查询的情况,此时采用KeyPrefixRegionSplitPolicy较好。 所以这个策略适用的场景是:

  • 数据有多种前缀。
  • 查询多是针对前缀,较少跨越多个前缀来查询数据。

4. DelimitedKeyPrefixRegionSplitPolicy

拆分策略

该策略也是继承自IncreasingToUpperBoundRegionSplitPolicy,它也是根据你的rowkey前缀来进行拆分的。唯一的不同就是:KeyPrefixRegionSplitPolicy是根据rowkey的固定前几位字符来进行判断,而DelimitedKeyPrefixRegionSplitPolicy是根据分隔符来判断的。

在有些系统中rowkey的前缀可能不一定都是定长的,比如你拿服务器的名字来当前缀,有的服务器叫host12有的叫host1。这些场景下严格地要求所有前缀都定长可能比较难,而且这个定长如果未来想改也不容易。DelimitedKeyPrefixRegionSplitPolicy就给了你一个定义长度字符前缀的自由。

相关配置

DelimitedKeyPrefixRegionSplitPolicy.delimiter

使用该参数定义的分隔符分隔rowkey,分隔后的前部分相同的rowkey拆分后一定会在一个Region中。

配置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameStr));
tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.DelimitedKeyPrefixRegionSplitPolicy");
tableDesc.setValue("DelimitedKeyPrefixRegionSplitPolicy.delimiter", "_");
...

拆分效果

5. SteppingSplitPolicy

策略描述

这种策略和IncreasingToUpperBoundRegionSplitPolicy策略很相似,但更简单,第一个Region容量的上限为256M,之后都是10G,这个策略考虑到IncreasingToUpperBoundRegionSplitPolicy会多拆分几个Region(256M -> 2G -> 6.75G -> 10G),所以进行了简化,它的源码只有一个方法,其他都是继承自IncreasingToUpperBoundRegionSplitPolicy类

设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameStr));
tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy");

6. BusyRegionSplitPolicy (HBase-2.x Only)

策略描述

此前的拆分策略都没有考虑热点问题。所谓热点问题就是数据库中的Region被访问的频率并不一样,某些Region在短时间内被访问的很频繁,承载了很大的压力,这些Region就是热点Region。

相关配置

hbase.busy.policy.blockedRequests
default: 0.2f
description: 请求阻塞率,即请求被阻塞的严重程度。
取值范围是[0.0, 1.0],默认是0.2,即20%的请求被阻塞的意思。hbase.busy.policy.minAge
default: 600000 (10min)
description: 拆分最小年龄。
当Region的年龄比这个小的时候不拆分,这是为了防止在判断是否要拆分的时候出现了短时间的访问频率波峰,结果没必要拆分的Region被拆分了,因为短时间的波峰会很快地降回到正常水平。单位毫秒,默认值是600000,即10分钟。hbase.busy.policy.aggWindow
default: 300000 (5min)
description: 计算是否繁忙的时间窗口,单位毫秒,默认值是300000,即5分钟。
用以控制计算的频率。

如何确定为热点Region(Busy Region)

如果"当前时间 – 上次检测时间" >= hbase.busy.policy.aggWindow,则进行如下计算:

请求的被阻塞率(aggBlockedRate) = 这段时间被阻塞的请求 / 这段时间的总请求

如果 aggBlockedRate > hbase.busy.policy.blockedRequests 且该Region的 hbase.busy.policy.minAge > 10min,则判断该Region为Busy Region

当Region被判定为Busy Region,就会被拆分。

设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameStr));
tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.BusyRegionSplitPolicy");# 以下配置根据需要适当修改
tableDesc.setValue("hbase.busy.policy.blockedRequests", "0.2");
tableDesc.setValue("hbase.busy.policy.minAge", "600000");
tableDesc.setValue("hbase.busy.policy.aggWindow", "300000");

适用场景

如果你的系统常常会出现热点Region,而你对性能有很高的追求,那么这种策略可能会比较适合你。它会通过拆分热点Region来缓解热点Region的压力,但是根据热点来拆分Region也会带来很多不确定性因素,因为你也不知道下一个被拆分的Region是哪个。

7. DisabledRegionSplitPolicy

策略描述

禁止Region拆分,这个策略是极少使用的,因为就算是你按照自己数据的特性在建表的时候合理的进行了预拆分(即还没有写入的数据的时候就已经手动分好了Region),但是后续随着数据的持续写入,我们自己预先分好的Region的大小也一定会达到阈值,那时候还是要依靠HBase的自动拆分策略去拆分Region。

当然,这种策略也有它的用途:

假如我们有一批数据,根据它的用途我们知道它分为几个Region或者在什么时候拆分最合适,例如有一批数据,rowkey是手机号,而且每个手机号码前缀下(手机号码前三位)的数据量都差不多,而且这批数据主要是用于查询,要求查询的性能好一些,而且这批数据是一批静态数据,即一次存入后以后不会再加入新数据,而且这批数据的量很大,那么此时预先设置好拆分点(比如每个相同的手机号前缀一定要分到一个Region下),设置拆分策略为禁止拆分,然后导入数据即可。

在使用禁止自动拆分策略的诸多条件中,数据量大是很重要的一点,因为当使用自动拆分时,无论你设置了哪种拆分策略,一开始数据进入HBase的时候都只会往一个Region塞数据。必须要等到一个Region的大小膨胀到某个阀值的时候才会根据拆分策略来进行拆分。但是当大量的数据涌入的时候,可能会出现一边拆分一边写入大量数据的情况,由于拆分要占用大量IO,此时HBase数据库的压力是很大的。

设置方法

HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableNameStr));
tableDesc.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy");

关于Region的预拆分,HBase Region 预拆分(还没有写…)一文中将会详细说明。

HBase Region 自动拆分策略相关推荐

  1. hbase region拆分的三种方式

    我们都知道,region在数据量大到一定程度的时候,会进行拆分(最开始由一个变成二个),而拆分的方式有三种,包括预拆分.自动拆分.手动强制拆分.下面就来介绍介绍拆分的方式. 预拆分 预拆分(pre-s ...

  2. HBase:Region的拆分

    为什么要拆分Region 首先,Region是一段Rowkey数据的集合,当查询一条数据时,会先从元数据中判断该条数据的Rowkye属于哪个Region,然后到指定的Region中查找.当一个Regi ...

  3. HBASE region简介

    HBASE region简介 一.为什么要预分区 二.region拆分方式 (一)自动拆分 (二)预拆分 (三)强制拆分 三.推荐Region拆分的方案 四.Hbase的Web界面简单介绍 五.ROW ...

  4. Hbase Region拆分入门

    HBase通常根据hbase-default.xml和hbase-site.xml配置文件中的设置来处理区域划分.重要设置包括hbase.regionserver.region.split.polic ...

  5. 华为HD 6.5.1.7版本 hbase region分裂问题

    [操作步骤&问题现象] hbase 版本 1.3.1 有关region分裂参数采用默认未调整. [问题现象] 现有A业务 每天创建一个hbase表预分5region,最近查看时发现表变成10r ...

  6. HBase Region原理总结归纳

    HBase Region原理总结 1. 环境准备 基于Hadoop 3.2.1 基于zookeeper 3.4.6 基于Hbase 2.2.5 资料来源: 官网http://hbase.apache. ...

  7. Hbase Region的切分与合并【原理分析】

    一.Region的切分 Region的自动切分 Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,当然他也是分布式系统追求扩展性很好的功能.当一个Region大到一定程度,会进行分裂 ...

  8. HBase Region 简介和建议数量大小

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区. region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region. ...

  9. hbase region split 过程(翻译)

    hbase region split 过程(翻译) 由于写请求是由regionserver处理的,它们会存储在被称作memstore的内存存储系统中.一旦memstore填满,它的内容就会被写到磁盘上 ...

最新文章

  1. 推荐100份:高并发高可用和中台一网打尽
  2. 使用Aspose.Pdf for .NET实现PDF文档到Excel、EPS、SVG等的转换
  3. keil编写正弦函数_【高中数学】62个重要函数图像
  4. 关于浏览器兼容问题的解决办法,全部都在这里了
  5. 大竹中学2021高考成绩查询,四川大竹中学2021录取分数线
  6. html如何在li里加a,li里面嵌套a标签html和css小例子
  7. 如何将Rant变成生产力电动工具
  8. python短视频自动制作_Python 带你一键生成朋友圈超火的九宫格短视频
  9. 无状态EJB:池化和生命周期
  10. PSR-2 代码风格规范
  11. linux文件浏览 ls,linux浏览文件命令
  12. java并发编程(十七)内存操作总结
  13. 饶毅教授对非升即走的思考
  14. css transition改动透明,使用CSS transition和animation改变渐变状态的实现方法
  15. Java代码内容概述
  16. MapReduce之RecordWriter理解
  17. vue实现点击高亮效果_vue结合Echarts实现点击高亮效果的示例
  18. CDH使用Solr实现HBase二级索引
  19. [Android app] Linux串口驱动配置,可执行程序测试,App串口通信程序
  20. PyQGIS开发者手册-4 使用栅格图层

热门文章

  1. 一种语音控制PPT翻页系统的制作方法
  2. linux开机自启动python脚本_linux怎么让一个python脚本开机自动开启
  3. fiddler修改支付金额_Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解+代码
  4. 中国近代史自考必备简答题(一)
  5. sudo修改文件夹名字_用 Python 高效智能管理文件夹
  6. .net5 程序 在docker 中运行
  7. adb ps shell 查看进程,如何使用ADB命令检测正在运行的应用程序
  8. layUI数据表格(table)
  9. 纯html网页,如何快速把所有字体的颜色都改成黑色的,原来模板默认的字体是灰色
  10. DB2 jdbc url 写法