我们知道在hbase中,所有的region之间会共享一块memstore内存区域,所以如果region越多,那么memsotre刷新的就会很频繁,此时会产生非常多小的HFiles,这些小的Hfile就会触发更多的合并操作。由此可以看到的现象就是:
1、hbase整个集群的CPU负载很高,几乎快撑满100%了 2、hbase的内存一直居高不下,降不下来。 3、磁盘的I/O也很高
从而产生的影响就有:
1、API请求出现大量超时,数据写不进去,数据读不出来 2、HDFS上出现大量的小文件(HFile)
那么我们的region在多少应该算是一个合理的水平呢? 这个在之前的问答社区我们已经给出了案例,详情可参考:《Hbase集群中,每个节点分配多少region合适?》。
那么出现region过多的情况,我们如何来进行调整呢?下面我们列举一些方法:
1、region的大小保持在10-40GB大小,如果region过多,可以把region的大小设置大一点。 2、可以重新创建一张表,把新表做一个预分区,然后把老表的数据拷贝到新表去,减少分裂的情况。 3、手动合并(merge)现有表的region,使用的命令如: merge_region 'xxx','xxxx',具体键下图
除了解决region过多的问题,我们还有更重要的是防范region过多的问题,那么如何防范呢?下面列举一些措施:
1、设置region的大小至少是10GB,可以稍微大点,配置高的话可以设置40GB左右。 2、HBase默认的split策略(org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy )确保region绝对不会超过配置的最大值(hbase.hregion.max.filesize )。但是,当集群负载比较小的时候(少于100 region) , 可能会创建很多较小的region 。为了确保你的region 能增长至正常的大小,要验证hbase.hregion.nax.file size属性值是滞设置成了至少lOGB 。这个属性值以字节表示,即是10737418240 。当然,常见的做越是设置将最大文件大小设为更大的lOOGB 。当使用较大的region大小时,需要手动管理splito 确保split 的时间合适 ,对HBase集群操作和SLA影响最小。 3、不要滥用列族的数量,一般设置1-2个即可,千万不建议超过2个。因为特定region memstore会在不同的列族间拆分,列族太多会减少各自可用的内存,导致 些列族的刷新幅度很小。同样,由于刷新后的文件比较小,将造成多余的合并。减少列族数量,对于剩下的列族,每个region 能拥有更多的内存,省去不必要的刷新和合井,让每台服务器能处理更多的region
以上就是关于region过多的一些解决与预防措施。
还没有评论,来说两句吧...