Region分裂
当MemStore的数据超过阈值时,将数据溢写磁盘,生成一个StoreFile文件。当Region中最大Store的大小超过阈值时,Region分裂,等分成两个Region,实现数据访问的负载均衡。新的Region的位置由HMaster来确定在哪个RegionServer中。
下面是具体的细节:
1.当一个region里的StoreFile增长到大于配置的参数:hbase.hregion.max.filesize的大小,也可以在创建HBase表的时候指定这个参数,region会被一分为二。这个过程一般在2-3S内完成,对写数据的影响有短暂的暂停, 由于zookeeper全程记录分裂过程 ,因些分裂服务器失败的时候,其它服务器是可以知道这个region的状态 ,分裂在高并发写的情况下,影响非常大,如何减少在写入过程中region的分裂,是利用好HBase的关键所在,整个分裂是的流程如下:
- region所在regionServer创建splits目录;
- 关闭要分裂的region的读写请求;
- 在splits目录中创建所需要的文件结构;
- 移动两个新region文件目录到目录表中,并更新.META表;
- 异步复制父region中的数据到两个子region中(最主要的消耗时间);
- 复制完成后、打开两个新产生的region,并上线,可以接收新的读写请求;
- 异步任务把定时把原来被分裂的region从.META表中清除掉,并从文件系统中删除该region所占用的空间;
2.分割点的确定: Region中StoreFile最大文件中的内部中点
3.执行Region分裂的时间是: memStore刷到HDFS的时候,后台线程异步执行,所在类名为MemStoreFlusher.
Region合并
1.随着MemStore不断有数据写入,当MemStore的大小超过配置或默认大小的时候,HBase会把MemStore中的数据刷新到HDFS中,生成新的StoreFile文件 ,当一个region中包含的StoreFile文件数目超过配置地的阈值,后台合并任务,会把这些文件合并成数量更少,体积更大的文件。
2.当这个过程持续到这些文件 中最大的StoreFile文件 超过配置最大存储文件 大小时,此时会触发一个region拆分操作,减少读取过程中的IO。
3.Region合并分为两种,minor合并和major合并
3.1 Minor合并:
是把最后生成的几个小的StoreFile文件 合并一个更大的StoreFile, 默认同时合并的文件数为10, 主要控制参数如下;hbase.hstore.compaction.min
最小合并文件 数量大小, 默认为3hbase.hstore.compaction.max
最大合并文件 数量大小, 默认为10hbase.hstore.compaction.max.size
最大合并文件 的大小 , 默认值 为Long.MAX_VALUEhbase.hstore.compaction.min.size
最小合并文件 的大小, 默认值是memStore刷写的大小, 它是一个阈值, 它包含所有小于限制的文件 ,直到达到每次压缩允许的总文件数量
3.2 Major合并:
是把整个Store中所有StoreFile文件 合并成一个单独的StoreFile文件,后台定时任务定期检查, 这个检查周期是由下面这两人个参数决定hbase.server.thread.wakefrequency
* hbase.server.thread.wakefrequency.multiplier(默认值为1000)