热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBaseRegion自动拆分策略

原文地址:https:cloud.tencent.comdeveloperarticle1374592HBase自定义拆分策略自定义拆分策略您可以使用自定义Re

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


HBase自定义拆分策略

自定义拆分策略

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

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

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

hbase.regionserver.region.split.policyorg.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy

使用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中配置,例如:

hbase.regionserver.region.split.policy org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy


  • 在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 预拆分(还没有写…)一文中将会详细说明。


推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
evenstand_291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有