HBase:Region的拆分

2 篇文章 0 订阅
订阅专栏

为什么要拆分Region

首先,Region是一段Rowkey数据的集合,当查询一条数据时,会先从元数据中判断该条数据的Rowkye属于哪个Region,然后到指定的Region中查找。当一个Region过大时,在这个Region中查找Rowkey的时间也越长。

举个栗子,假设某个region中有100w条数据,现在要在这个region中查找某条数据,则需要遍历这100w条数据;而如果将这个region拆分成10份,那么可以从元数据中知道这条数据属于哪个region,即只要访问拆分后的那个region,即10w条数据。显而易见,在100w条数据中找一条的效率明显没有在10w条数据中找一条高。这也是为什么HBase的效率比MySQL和SQL Server高的原因:传统数据库只把数据放在一个地方,而HBase是将数据分布在多个Region中。

通常较少的region数量可使群集运行的更加平稳,官方指出每个RegionServer大约100regions以内的时候效果最好。因为每个region的每个列簇都有一个写缓存MemStore(默认2M),当region和列簇的数量过多时,内存占用也会提高。而且HBase底层在读取数据时使用的是mapreduce,当region过多时,也会启动大量的map任务。

Region分为自动拆分和手动拆分两种拆分方式

 

自动拆分

根据region大小触发拆分

早期(0.94版本前)HBase仅根据Region中最大的列簇大小(即一个Store,也即HFile)进行自动拆分,默认拆分阈值为10G,当大小达到10G后,将这个region拆分为两个region。参数为:

hbase.hregion.max.filesize

 

根据文件大小动态触发拆分

0.94版本之后,有了IncreasingToUpperBoundRegionSplitPolicy策略。即动态限制region大小上限策略。这也是默认的触发方式。

当region数量较少时,触发切分的阈值也较低,随着region数量提升,触发拆分的阈值也随之提升,但不会超过一个限定的值。

当region的数量在0~100之间,则根据以下公式计算触发拆分的阈值:

Math.min( region数量 ^ 3 * 初始大小, 默认最大文件大小  )

实现代码如下:

/**

   * @return Region max size or {@code count of regions cubed * 2 * flushsize},

   * which ever is smaller; guard against there being zero regions on this server.

   */

  protected long getSizeToCheck(final int tableRegionsCount) {

    // safety check for 100 to avoid numerical overflow in extreme cases

    return tableRegionsCount == 0 || tableRegionsCount > 100

               ? getDesiredMaxFileSize()

               : Math.min(getDesiredMaxFileSize(),

                          initialSize * tableRegionsCount * tableRegionsCount * tableRegionsCount);

  }

初始大小由hbase.increasing.policy.initial.size参数控制,如果没有设置的话,则用memstore的刷写大小的2倍,即hbase.hregion.memstore.flush.size * 2。

确定初始大小的代码逻辑为: 

   Configuration conf = getConf();

    initialSize = conf.getLong("hbase.increasing.policy.initial.size", -1);
    //如果设置了,则直接返回

    if (initialSize > 0) {

      return;

    }

    HTableDescriptor desc = region.getTableDesc();
    //如果没有设置或小于0,则为MemStoreFlushSize的两倍

    if (desc != null) {

      initialSize = 2 * desc.getMemStoreFlushSize();

    }

    if (initialSize <= 0) {

      initialSize = 2 * conf.getLong(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,

                                     HTableDescriptor.DEFAULT_MEMSTORE_FLUSH_SIZE);

    }

默认最大文件大小由hbase.hregion.max.filesize参数控制,即Region最大大小。

假如hbase.hregion.memstore.flush.size定义为128MB,那么文件大小的上限增长将是这样:
(1)刚开始只有一个文件的时候,上限是256MB,因为1^3 * 128*2 = 256MB。
(2)当有2个文件的时候,上限是2GB,因为2^3 * 128*2 = 2048MB。
(3)当有3个文件的时候,上限是6.75GB,因为3^3 * 128 * 2 = 6912MB。
(4)以此类推,直到计算出来的上限达到hbase.hregion.max.filesize region所定义的10GB。

Region大小上限的增加如图:

 

当Region个数达到4个的时候由于计算出来的上限已经达到了16GB大于10GB了,所以后面当Region数量再增加的时候文件大小上限已经不会增加了。在最新的版本里IncreasingToUpperBoundRegionSplitPolicy是默认的配置。

 

以长度自定义拆分前缀

KeyPrefixRegionSplitPolicy 是IncreasingToUpperBoundRegionSplitPolicy的子类。在以文件大小触发region拆分的基础上,可以在拆分时根据rowkey的前缀进行拆分。

如:某个region内包含两种前缀的rowkey,分别为:cn001~cn999和us001~us999。当触发了对这个region的拆分时,可能前缀为cn的数据中列较多,数据大小更大,按照默认的拆分方式,将这个region按照文件大小平均拆分成两份,则可能有部分前缀为cn的rowkey会和前缀为us的rowkey被放在同一个新的region,如图:

当使用KeyPrefixRegionSplitPolicy的方式拆分,则结果如下:

KeyPrefixRegionSplitPolicy可以保证相同前缀的rowkey不会被拆分到两个不同的Region里面。通过以下参数来指定rowkey前几个字符为前缀:

KeyPrefixRegionSplitPolicy.prefix_length

这个策略适用的场景是:

1. 数据有多种前缀。

2. 查询多是针对前缀,比较少跨越多个前缀来查询数据。

 

以分隔符自定义拆分前缀

DelimitedKeyPrefixRegionSplitPolicy与上面的KeyPrefixRegionSplitPolicy方式相同,都是在以文件大小为触发拆分的基础上根据rowkey前缀进行拆分。区别在于,KeyPrefixRegionSplitPolicy是以字符串长度指定前缀,而DelimitedKeyPrefixRegionSplitPolicy是以分隔符区分前缀,书中举例:如果以服务器的名字来当前缀,有的服务器叫host12有的叫host1,甚至有的服务器较host101。那么以字符串长度就难以区分各服务器名。

但是可以通过如下参数定义前缀分隔符:

DelimitedKeyPrefixRegionSplitPolicy.delimiter

比如定义了前缀分隔符为_,那么host1_001和host12_999的前缀就分别是host1和host12。

 

热点region拆分策略

上述几种都是根据文件大小为触发条件进行region拆分。但是,假如两个大小相同的region,且都远没有达到触发拆分条件的文件大小,而其中一个region由于包含较多的热点rowkey,导致这个region的访问量远大于另一个region,已经不堪重负,但是region大小离触发拆分条件还遥遥无期,拆分这个region已迫在眉睫。

BusyRegionSplitPolicy就是为了解决这种场景而产生的。

BusyRegionSplitPolicy策略通过以下参数判断哪些region为热点region:

hbase.busy.policy.blockedRequests:请求阻塞率,即请求被阻塞的严重程度。取值范围是0.0~1.0,默认是0.2,即20%的请求被阻塞的意思。

hbase.busy.policy.minAge:拆分最小年龄,当Region的年龄比这个小的时候不拆分,这是为了防止在判断是否要拆分的时候出现了短时间的访问频率波峰,结果没必要拆分的Region被拆分了,因为短时间的波峰会很快地降回到正常水平。单位毫秒,默认值是600000,即10分钟。

hbase.busy.policy.aggWindow:计算是否繁忙的时间窗口,单位毫秒,默认值是300000,即5分钟。用以控制计算的频率。

判断Region是否属于热点region的逻辑如下:

如果“当前时间–上次检测时间>=hbase.busy.policy.aggWindow”,则进行如下计算:这段时间被阻塞的请求/这段时间的总请求 = 请求的被阻塞率(aggBlockedRate),如果“aggBlockedRate >hbase.busy.policy.blockedRequests”,则判断该Region为热点region。

 

禁止拆分region

DisabledRegionSplitPolicy策略会禁止Region自动拆分,但是可以通过手动拆分来拆分Region。

 

预拆分

书中还介绍了预拆分,即在建表时就指定region个数以及拆分条件。书中介绍的是通过命令行创建,但是一般在HBase的web界面创建更加方便,所以不做记录。

 

手动拆分

可以在hbase shell中调用split方法手动拆分region。

split方法的调用方式如下:

split 'tableName'
split 'namespace:tableName'
split 'regionName' # format: 'tableName,startKey,id'
split 'tableName', 'splitKey'
split 'regionName', 'splitKey'

 

Hbase Region拆分和合并
像风一样的男子
07-18 4280
Region拆分合并
HBase 管理(Region自动拆分,预拆分,强制拆分Region合并,HFile的合并)(四)
May_J_Oldhu的博客
01-07 2521
HBase 管理一.HBase管理1.Region管理1.1Region的自动拆分(1)ConstantSizeRegionSplitPolicy(2)IncreasingToUpperBoundRegionSplitPolicy(0.94 版本后默认)(3)KeyPrefixRegionSplitPolicy(4)DelimitedKeyPrefixRegionSplitPolicy(5)BusyRegionSplitPolicy(6)DisabledRegionSplitPolicy1.2Region
HBase 架构
梁辰兴的博客
10-12 4780
包含访问HBase的接口并维护cache来加快对HBase的访问。
HBase Region分裂
lxf310的专栏
03-28 1万+
HBase region的分裂过程如图所示,其中红色代表RegionServer和或Master的行为,绿色的代表Clients的行为。 1、RegionServer决定本地的region分裂,并准备分裂工作。第一步是,在zookeeper的/hbase/region-in-reansition/region-name下穿件一个znode,并设为SPLITTING状态。 2、Maste
hbase region拆分的三种方式
bigdata_player
04-15 5060
我们都知道,region在数据量大到一定程度的时候,会进行拆分(最开始由一个变成二个),而拆分的方式有三种,包括预拆分、自动拆分、手动强制拆分。下面就来介绍介绍拆分的方式。 预拆分拆分(pre-splitting)就是在建表的时候就定义好了拆分点的 算法,所以叫预拆分。 预拆分一部分的作用能减少rowkey热点,另外一部分能减轻region切分时...
Hbase-原理-region拆分
m0_46538284的博客
11-27 876
Hbase 表的拆分 (shell) 未拆分前表的样子 list_regions 'tb_stu' 拆分后 split 'a338a854bfcdd315f4e28c0cb0ac0d11', 'rk001' 在HDFS中查看 拆分完,原来的region Name 会保留一段时间,一段时间后原来的region Name会被删除,只保留拆分后的region Name 移动拆分后的一个regionregion ...
HBase-拆分&合并
weixin_30917213的博客
12-24 480
本文来自转载,转载地址:https://www.jianshu.com/p/7359a1789d24 1 Region拆分 一个Region代表一个表的一段Rowkey的数据集合,当Region太大,Master会将其拆分Region太大会导致读取效率太低,遍历时间太长,通过将大数据拆分到不同机器上,分别查询再聚合,Hbase也被人称为“一个会自动分片的数据库”。Region可以手动...
HBase Region管理(拆分+合并+负载均衡)
因上努力,果上随缘。但行好事,莫问前程。
08-31 2077
每个 RegionServer 包含多个 Region,而每个 Region 又对应多个 Store,每一个 Store 对应表中一个列族的存储,且每个 Store 由一个 MemStore 和多个 StoreFile 文件组成。StoreFile 在底层文件系统中由 HFile 实现,也可以把 Store 看作由一个 MemStore 和多个 HFile 文件组成。...
Hbaseregion合并与拆分
01-07
region过大的时候.hbase拆分region , 这也是Hbase的一个优点 . HBaseregion split策略一共有以下几种: 1、ConstantSizeRegionSplitPolicy 0.94版本前默认切分策略 当region大小大于某个阈值(hbase.hregion....
Hbase region 的切分过程
weixin_39950222的博客
09-14 614
需根据Hbase的目录结构来分析,该过程完成迅速,只是在为region创建两个引用文件,每个持有原region的一半 HBase将整个切分过程包装成了一个事务,意图能够保证切分事务的原子性。 首先regionserver在父region下创建切分目录,当创建成功后会关闭该region 在切分目录下创建相应的文件结构:两个子region目录以及引用文件,每个引用文件指向原始reion的一...
hbase5:region拆分详解
刚哥的大数据之路
08-18 781
针对region拆分: 1.某个region拆分 2.自动的拆分,随着数据的越来越多,单节点regionserver管理的数据很多,增加查询热点的概率 默认的拆分策略(大小) 计算公式为: Min{ 1^32128M 256M (当刚开始创建比较小只有一个region的时候256m就可以) 2^32128M 2G(当有两个region的时候) 3^32128M 6.75G(当有3个region的时候) 10G 10G } 3.预分region,建表的时候制定切分点 按照默认大小拆分
一篇文章搞懂 HBaseregion 拆分机制
热门推荐
Shockang的博客
06-24 1万+
前言 本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系 正文 region 中存储的是大量的 rowkey 数据,当 region 中的数据条数过多的时候,直接影响查询效率。 当 region 过大的时候,hbase拆分 region , 这也是 hbase 的一个优点 . HBaseregion split 策略一共有以下几种 1、ConstantSiz
HBase之五:hbaseregion分区
weixin_34126215的博客
06-25 463
一、Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下: Table (HBase table) Region (Regions for the table) Store (Store per ColumnFamily for each Region for t...
HBaseRegion切分原理
heima201907的博客
10-30 736
HBaseRegion切分原理 Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,也必然是所有分布式系统追求无限扩展性的一副良药。HBase系统中Region自动切分是如何实现的?这里面涉及很多知识点,比如Region切分的触发条件是什么?Region切分的切分点在哪里?如何切分才能最大的保证Region的可用性?如何做好切分过程中的异常处理?切分过程中要不...
Apache HBase region 拆分
北京小辉
09-19 727
目录 一、描述 二、提前分区 三、自动分区 四、强制分区 五、参考连接 一、描述        在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的。一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中。在自动split策略中,当一个re...
HBase源码分析 -- HBase Region 拆分(split)
架构师思考实践
07-01 935
代码版本:hbase-1.2.6 工程:hbase-server 类:org.apache.hadoop.hbase.regionserver.HRegion 1、判断是否需要切分 方法: checkSplit 返回值: splitpoint 做了一些判断后,其实是调用: byte[] ret = splitPolicy.getSplitPoint(); 2、切分策略 o
Apache HBase region拆分
数据源的港湾
06-26 2916
本篇文章主要分享Apache HBase如何通过regions实现负载均衡以及如何管理region拆分HBase以表的形式存储多行数据。表被划分为”regions“。Regions分布在集群的不同节点上,通过RegionServer进程被客户端调用。一个region由一组连接的Key组成,从一个start key开始,以end key结尾。Region之间不会overlap,这意味着一个固定的ro
Hbaseregion自动拆分
weixin_43648241的博客
10-10 253
region自动拆分的大小默认是10个G 当region第一次拆分时,是达到256M就拆分,这个时候就拆分成两个region 接下来这两块region达到2G时,再开始拆分,这个时候就拆分成3个region 再接下来是达到6.7个G,再开始拆分region到4个以后,则达到10个G才开始拆分 ...
Apache HBase【从无到有从有到无】【AH4】Apache HBase配置
琴韵悠悠
11-01 989
目录 1.Apache HBase配置 1.1.配置文件 1.2.基本先决条件 1.2.1.操作系统实用程序 1.2.2.Hadoop 1.2.2.1.dfs.datanode.max.transfer.threads 1.2.3.ZooKeeper要求 1.3.HBase运行模式:独立和分布式 1.3.1.Standalone HBase 1.3.1.1.HDFS上的独立HB...
hbaseregion拆分
最新发布
07-11
HBase中的数据存储和管理是通过Region来现的。RegionHBase中数据的辑划分单元,每个表都划分为多个Region进行存储。 一个Region的大小超过了HBase的阈值(默认为10GB),或者某个Region的存储负载过重时,HBase会触发Region拆分操作来解决些问题。Region的分过程如下: 1.描:HBase会定扫描整个集群,检查是否有需要拆分Region。这个扫描过程可以通过配置参数进行调整。 2. 拆分策略:如果一个Region符合拆分条件,HBase会根据预定义的拆分策略进行拆分拆分策略通常是基于Region的大小或者存储负载来确定。 3. 拆分过程在拆分过程中,HBase会为原始Region创建一个新的子Region,然后将原始Region中一部分数据迁移至子Region拆分过程是渐进式的,即不会一次性将所有数据迁移完毕。 4. 数据迁移:在拆分过程中,HBase使用Hadoop的HDFS来进行数据迁移。数据迁移是通过将原始Region中的HFile进行切割和重新分配来实现的。 5. 更新元数据:拆分完成后,HBase会更新元数据信息,包括新Region的位置和范围等信息。 通过Region拆分HBase可以实现自动的负载均衡和数据的水平扩展。同时,拆分也可以避免Region过大导致的性能问题,提高系统的整体性能和可靠性。
写文章

热门文章

  • Hudi:初识Hudi 11090
  • python:pyinstaller打包后,运行exe提示缺失包文件 10678
  • Excel:替换换行符 8707
  • spark-sql:将查询结果输出到文件 8241
  • 漫谈:一个工作两年半的程序员的人生感悟 8155

分类专栏

  • 笔记 3篇
  • Impala 1篇
  • spark 16篇
  • hudi 2篇
  • python 7篇
  • hive 7篇
  • hadoop 3篇
  • 杂谈 3篇
  • Hbase 2篇
  • java 7篇
  • 数据结构复习
  • flink 10篇
  • shell 2篇
  • 基础算法 3篇
  • sqoop 1篇
  • kudu 1篇
  • kafka 1篇
  • maven 1篇
  • 机器学习算法
  • 后端开发

最新评论

  • SQL骚套路笔记

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加除了各种控件外,文章正文的字数;(2)使用更多的站内链接;(3)提升标题与正文的相关性。

  • Java通过post请求调用openai接口

    CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • python:pyinstaller打包后,运行exe提示缺失包文件

    c语言好简单: 太正常了

  • flink:java.lang.NoClassDefFoundError: org/apache/kafka/common/errors/InvalidTxnStateException报错

    绝顶喵喵拳: 我遇到了同样的问题,但是我的flink1.17.0没有flink-connector-kafka_0.11_2.11的版本,哭死

  • Flink对接kafka 之kafka source和kafka sink

    m0_52725114: 大佬,对于你文章中提到的checkpoint机制及二阶段提交机制在主页没有找到,是否后续没有了呢

大家在看

  • 基于ssm+vue.js的房屋交易系统附带文章源码部署视频讲解等 1035
  • 纳什均衡简单理解
  • 喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法
  • Linux常用命令大全超详细知识点概览 1080
  • 计算一段程序的执行时间 211

最新文章

  • Java通过post请求调用openai接口
  • spark对接hudi遇到的坑
  • python:excel导入hive
2024年1篇
2021年13篇
2020年56篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场美陈公司哪家好人物玻璃钢雕塑定做厂家佛像玻璃钢雕塑工厂呼和浩特小区玻璃钢雕塑公司滁州公园玻璃钢雕塑市场糖果巷玻璃钢雕塑中意玻璃钢雕塑壁纸锦州名人玻璃钢雕塑芜湖玻璃钢雕塑制作公司江门玻璃钢雕塑定做南昌玻璃钢雕塑公司喀什玻璃钢雕塑温州玻璃钢雕塑哪家便宜通辽广场玻璃钢雕塑安装济源商场美陈绿植墙安阳景观玻璃钢雕塑厂家拱墅区玻璃钢雕塑公司铜仁贵州玻璃钢雕塑价格江西玻璃钢卡通雕塑草莓玻璃钢海洋雕塑公司地址商场门头美陈网玻璃钢雕塑动漫公仔玻璃钢红旗雕塑关键词商场美陈农副产品惠济区玻璃钢大型雕塑宽城玻璃钢花盆花器商丘玻璃钢雕塑定做厂家玻璃钢雕塑白坯验收规范供应型号全的玻璃钢花盆潮州玻璃钢卡通造型雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化