天天看点

Region的拆分与合并

文章目录

        • 一、拆分与合并的目的
          • 1.拆分
          • 2.合并
        • 二、Region拆分
          • 1.自动拆分
          • 2.手动拆分
            • (1).Linux命令行创建
            • (2).在HBase命令行里创建
            • (3).指定拆分文件
            • (4).强制拆分
        • 三、Region合并
          • 1.Minor Compaction
          • 2.Major Compaction
          • 3.三种触发合并检查的情况
          • 4.合并操作

一、拆分与合并的目的

1.拆分
  • 当一个Region大到一定程度,或导致读取效率太低,所以会进行分裂
  • HBase可以通过Region Split达到负载均衡
  • Region的拆分分为自动拆分与手动拆分
2.合并
  • 当删除了大量的数据后,每一个Region都变小了,这时候再分多个Region就太浪费空间,可以将这些Region合并起来
  • 合并的主要目的不是为了性能考虑,而是出于维护的目的

二、Region拆分

1.自动拆分
  1. 在0.94版本之前,使用的拆分策略是.ConstantSizeRegionSplitPolicy,按照固定大小来拆分Region,即当Region的大小超过默认值(通常默认值是10G),Region就会被HBase拆分成两个Region,且是平均分配。
  2. 0.94版本之后,用到的拆分策略是 IncreasingToUpperBoundRegionSplitPolicy,即这种拆分方法是会随着Region个数变化而变化,比较灵活,具体的计算方法如下:
- tableRegionCounts:表在RegionServer上所有Region的总和
- initalSize:如果没有重新定义hbase.increasing.policy.initial.size,它的大小就是Memstore的2倍,也就是128*2M
- defaultRegionMaxFileSize:Region的最大大小,默认是10G
           

通过计算可以得出,当Region的个数分别为1,2,3时,文件大小的上限分别为256M,2G,6912M。当Region个数大于等于4个,文件大小已经超出10G,所以上限只能是10G

2.手动拆分

(1).Linux命令行创建

hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table2 HexStringSplit -c 5 -f mycf
           

org.apache.hadoop.hbase.util.RegionSplitter——调用的一个切分Region类

my_split_table2——表名

HexStringSplit——拆分点算法,这里采用16进制

-c ——Region的个数

-f ——列族名

执行完成后可以进入HBase中查看是否创建成功

然后登陆网页能够更直观的看到自己切分的Region:localhost:60010——localhost要用自己的ip地址

Region的拆分与合并

(2).在HBase命令行里创建

hbase(main):009:0> create 'split2','mycf2',SPLITS=>['aa','bb','cc','dd','ee','ff','zz']
0 row(s) in 2.2930 seconds
=> Hbase::Table - split2
           

同样也可以登陆网页查看切分是否成功。

(3).指定拆分文件

首先编辑一个拆分文件student.txt,如下图,每一行不能有重复

aa
bb
ff
ag
sd
dd
gg
~
           

在HBase命令行开始创建表:

hbase(main):012:0> create 'stu','info',SPLITS_FILE=>'/root/datas/student/student.txt'
0 row(s) in 2.2610 seconds

=> Hbase::Table - stu
hbase(main):013:0>
           

只需要指定拆分文件即可。

(4).强制拆分

以上三种拆分方式也叫做Region的预拆分。下面这种属于对Region的强制拆分。

Region的拆分与合并

上图是之前做的一个Region通过HBase命令行进行拆分

split2——表名

bb——起始key

1595513677802——终止key

c798b2717d6d7006bd67ad4e6197ed43——终止key的id

现在可以根据这个id在bb和cc之间在强制拆分一个Region

HBase命令行输入命令:

hbase(main):014:0> split 'c798b2717d6d7006bd67ad4e6197ed43','c'
0 row(s) in 0.0450 seconds
           

就可以发现bb和ccRegion之间又强制被拆分一个Region

PS:因为Region的排序是按照字典顺序排序的,所以在强制拆分的时候,要注意Region名的大小

Region的拆分与合并

三、Region合并

1.Minor Compaction
  • 将一部分小文件合并成更少的大型文件,通过事件触发,合并速度较快;合并的时候不会真正的删除,只是打个标记
  • hbase.hregion.memstore.flush.size 缓存阈值大小 在hbase-site.xml文件中可以设置,默认是128M
  • hbase.hstore.compaction.max :每次compact的HFile的最大数目,默认是10
  • hbase.hstore.compaction.kv.max:compact时批量读取和写入KeyValue数据的数量,默认是10
2.Major Compaction
  • 将一个HStore中的所有文件合并成一个文件,通过时间触发,合并速度慢,同时还会删除合并之前的小文件,因此十分消耗性能,一般会将自动合并关掉。
  • hbase.hregion.majorcompaction 时间间隔,默认是7天
3.三种触发合并检查的情况
  1. MemStore被刷写到磁盘
  2. 执行shell命令compact,major_compaction或者调用相应API
  3. HBase后台线程周期性触发检查
4.合并操作
#compact一个表的所有regions
compact 't1'
#compact某个空闲的region
compact 'r1'
#compact一个region中的某个列族
compact 'r1', 'c1'
#compact一个表中的某个列族
compact 't1', 'c1'
           

继续阅读