HBase超详细版本教学六

Hbase—RegionSplit

HBase超详细版本教学六


Region分裂策略


我们刚建立表的时候只有一个Region,随着我们表中的数据量不断的增长,我们的Region会逐渐的分裂,相当于一个Region,变成了两个Region,之前的Region就没了,那么,这个Region什么时候进行分裂呢?


Region分裂过程


Region分裂完毕之后,尽可能的会让两个Region分裂的数据相同,这里提一个词汇预分区,它也会Split,分裂的细节只这样的,它生成两个新的Region,那么相当于在HDFS上相当于有什么呢?是不是会有两个新的路径?每一个Region在HDFS上体现出来的是一个路径,Region下面是有Store的,Store下面会有StoreFile的,那么我一个Region生成两个新的Region肯定是生成两个新的路径,将之前的数据,分成两半。

HBase超详细版本教学六

那么我在生成新路径的时候,是不是需要的时间会比较久呢?因为毕竟涉及到了数据的移动了,它不是直接将数据分开,放到新的路径,不是这样的。它分裂的时候确实会有新的路径产生,这两个路径下面并没有真的存我们的数据,它在两个新的路径下,相当于会有两个引用文件,它引用了老Region中,属于它的那部分数据,我们第一个分的时候,肯定是从其实RowKey,到中间的那个RowKey,从中间的RowKey到最后的RowKey是属于第二个Region,那么这个引用文件存储的相当于RowKey范围,有了这两个引用文件之后,我们这时候的两个Region就已经存放在我们的meta表中了。

HBase超详细版本教学六

然后我们的老Region就已经没有了,但是老Region中的文件还是在的,这个数据还在,这时候,来新的读写请求会怎么办呢?好比说,来读请求,老的Region已经没有了,那么我们肯定会请求新的Region。

HBase超详细版本教学六

那么新Region下是没有数据的,只有引用文件,引用文件中存储的都是RowKey范围,那么,它会根据这个RowKey范围去原来的老Region中,拿它对应的数据。这个时候我们的老的Region中的文件数据是在的还没有删除。

那么写请求,我们也会往新的Region中去写,写的话,我们就不会往老的Region中去写了,会在新的Region中去写。Flush的时候,也会在新的Region下进行Flush,生成新文件。不会去老Region.

HBase超详细版本教学六
那么问题来了,我们的老Region中的文件,什么时候会删除呢?我们的新Region也会不断的Flush生成新的文件,那么我们Flush之后是不是也要进行合并呢,当我们的新的Region下的文件,进行Major Compaction大合并的时候,这个时候,我们才会去老的Region中将对应的数据拿过来一起合并,进行统一的排序,该删除的进行删除,两个新的Region全部Major Compaction完毕之后,老Region数据全部得到转移,转移到了新的Region,这样老的Region才会被删除掉。


Region分裂时机

手撕官网,官网怎么看,直接Document点开

HBase超详细版本教学六
然后看版本,没有2.0,我们直接看2.1都一样

HBase超详细版本教学六

咱么直接点击Ref,也可以下载PDF的都可以,直接来到下面这个界面。这个就是HBase的参考指南。

HBase超详细版本教学六

我们直接搜索一下Split Policy分裂策略。

HBase超详细版本教学六

看了官网发现有6,7个,我们怎么配置呢?我们看到一个参数。

HBase超详细版本教学六

我们如果想用哪种分裂策略,我们直接可以将这个参数配置成全类名就可以了。标记红的都是分裂策略。

HBase超详细版本教学六

2.x版本的默认值是这个

HBase超详细版本教学六

这种配置,直接配置在HBase的xml文件中即可。

Split流程小结

预分区也会split。
在Region中找到一个合适的split point,在这个split point上将该Region的数据划分为两个新的Region。

Split发生时,新创建的子Region不会立即将所有数据重新写入新文件,而是会创建引用文件,指向老Region中的数据。
meta表中保存新Region,删除老Region。

读数据时会去老Region中读,但是写数据会写在新Region中。
在major compaction时,会将老Region的数据移动到新Region,删除老Region。
Master默认5分钟自动负载均衡。