Hbase-原理-region拆分

为什么要要拆分region
防止一个region server机器中存储的数据过多 引起并发热点的问题

会将一个大表分成不同的region交给不同的region server,形成了分布式数据库,减少了我们某一个机器的负载压力

拆分策略

  1. 默认的拆分策略(大小)
    · 当region的大小达到一定大小的时候会被拆分
    · 当hbase表在regionserver上的region,如果region的大小到达一个阈值,这个region将会分为两个。
    · 计算公式为:
    Min{
    1^32128M 256M
    2^32128M 2G
    3^32128M 6.75G
    10G 10G
    (表在一个regionserver上region的数量的立方) *2(the region memstore flush size),
    hbase.hregion.max.filesize(默认是10GB)
    }
    如果默认值情况下,一个表在一个regionserver上split的阈值是:
    256MB(第一次split),2GB(第二次),6.75GB(第三次),10GB(第四次),10GB… 10GB
  2. keyPrefixRegionSplitPolicy(自定义)
    这种拆分是在原来的拆分基础上 ,增加了拆分点(splitPoint,拆分点就是Region被拆分时候的rowkey)的定义,保证有相同前缀的rowkey不会被拆分到不同的Region上
    参数是 keyPrefixRegionSplitPolicy.prefix_length rowkey:前缀长度
  3. DelimitedKeyPrefixRegionSplitPolicy
    和上一种查分策略一致 , 上一种是按照key的固定长度拆分的 , 这种按照的是分割符
    DelimitedKeyPrefixRegionSplitPolicy.delimiter参分割符
  4. region预拆分
    row设计的一个关键点是查询维度
    (在建表的时候根据具体的查询业务 设计rowkey 预拆分)
    在默认的拆分策略中 ,region的大小达到一定的阈值以后才会进行拆分,并且拆分的region在同一个regionserver中 ,只有达到负载均衡的时机时才会进行region重分配!并且开始如果有大量的数据进行插入操作,那么并发就会集中在单个RS中, 形成热点问题,所以如果有并发插入的时候尽量避免热点问题 ,应当预划分 Region的rowkeyRange范围 ,在建表的时候就指定预range范围 .
    hbase> create ‘t1’, ‘f1’, SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
  5. 手动强制拆分
    没有预期到的查询热点数据 需要手动的拆分
    如果随着数据在执行的过程中出现部分region的热点问题, 那么这个region的数据必然会很大,这个时候需要我们手动的强制拆分region .
    建议
    1 预拆分初始化的数据
    2 后续采取自动拆让Hbase来管理region的拆分

Hbase 表的手动强制拆分 (shell)

  • 未拆分前表的样子

list_regions 'tb_stu'

hbaseRegina分裂默认是多大 hbase region拆分_大数据

  • 拆分后
split 'a338a854bfcdd315f4e28c0cb0ac0d11', 'rk001'

hbaseRegina分裂默认是多大 hbase region拆分_hbaseRegina分裂默认是多大_02

  • 在HDFS中查看

拆分完,原来的region Name 会保留一段时间,一段时间后原来的region Name会被删除,只保留拆分后的region Name

hbaseRegina分裂默认是多大 hbase region拆分_hbase_03

移动拆分后的一个region

  • 将region Name为aaa7d4f6003b2f6fc5ca88e78daf2ff5的region移动到linux03机器中去
move 'aaa7d4f6003b2f6fc5ca88e78daf2ff5','linux03,16020,1606458591086'

hbaseRegina分裂默认是多大 hbase region拆分_hbaseRegina分裂默认是多大_04

注意:手动拆分的过程中HDFS会生成新的region文件夹,文件夹中会有hfile文件;所以拆分的过程中会消耗大量的资源