HBase超详细版本教学六
Hbase—RegionSplit
Region分裂策略
我们刚建立表的时候只有一个Region,随着我们表中的数据量不断的增长,我们的Region会逐渐的分裂,相当于一个Region,变成了两个Region,之前的Region就没了,那么,这个Region什么时候进行分裂呢?
Region分裂过程
Region分裂完毕之后,尽可能的会让两个Region分裂的数据相同,这里提一个词汇预分区,它也会Split,分裂的细节只这样的,它生成两个新的Region,那么相当于在HDFS上相当于有什么呢?是不是会有两个新的路径?每一个Region在HDFS上体现出来的是一个路径,Region下面是有Store的,Store下面会有StoreFile的,那么我一个Region生成两个新的Region肯定是生成两个新的路径,将之前的数据,分成两半。
那么我在生成新路径的时候,是不是需要的时间会比较久呢?因为毕竟涉及到了数据的移动了,它不是直接将数据分开,放到新的路径,不是这样的。它分裂的时候确实会有新的路径产生,这两个路径下面并没有真的存我们的数据,它在两个新的路径下,相当于会有两个引用文件,它引用了老Region中,属于它的那部分数据,我们第一个分的时候,肯定是从其实RowKey,到中间的那个RowKey,从中间的RowKey到最后的RowKey是属于第二个Region,那么这个引用文件存储的相当于RowKey范围,有了这两个引用文件之后,我们这时候的两个Region就已经存放在我们的meta表中了。
然后我们的老Region就已经没有了,但是老Region中的文件还是在的,这个数据还在,这时候,来新的读写请求会怎么办呢?好比说,来读请求,老的Region已经没有了,那么我们肯定会请求新的Region。
那么新Region下是没有数据的,只有引用文件,引用文件中存储的都是RowKey范围,那么,它会根据这个RowKey范围去原来的老Region中,拿它对应的数据。这个时候我们的老的Region中的文件数据是在的还没有删除。
那么写请求,我们也会往新的Region中去写,写的话,我们就不会往老的Region中去写了,会在新的Region中去写。Flush的时候,也会在新的Region下进行Flush,生成新文件。不会去老Region.
那么问题来了,我们的老Region中的文件,什么时候会删除呢?我们的新Region也会不断的Flush生成新的文件,那么我们Flush之后是不是也要进行合并呢,当我们的新的Region下的文件,进行Major Compaction大合并的时候,这个时候,我们才会去老的Region中将对应的数据拿过来一起合并,进行统一的排序,该删除的进行删除,两个新的Region全部Major Compaction完毕之后,老Region数据全部得到转移,转移到了新的Region,这样老的Region才会被删除掉。
Region分裂时机
手撕官网,官网怎么看,直接Document点开
然后看版本,没有2.0,我们直接看2.1都一样
咱么直接点击Ref,也可以下载PDF的都可以,直接来到下面这个界面。这个就是HBase的参考指南。
我们直接搜索一下Split Policy分裂策略。
看了官网发现有6,7个,我们怎么配置呢?我们看到一个参数。
我们如果想用哪种分裂策略,我们直接可以将这个参数配置成全类名就可以了。标记红的都是分裂策略。
2.x版本的默认值是这个
这种配置,直接配置在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分钟自动负载均衡。