HBase 表级balancer配置

转载来自:https://blog.csdn.net/xiao_jun_0820/article/details/28648621 

今天测试用hbaseadmin.split手动对region进行拆分,拆分完之后,并没有和我想的那样region均衡分布到3个regionserver上去。感觉很莫名,说好的balancer呢,怎么不起作用,于是我手工执行了一下hbaseadmin.balancer(),还是没效果。尼玛!

把源码翻开了看终于发现了原因:

banancer是针对整个集群的region分布,而不是针对某个表的region分布。它只保证每个regionserver上分布的regions在平均regions的0.8到1.2倍之间。

avg = 整个集群的总region数/regionserver个数。

min = floor(avg*(1-0.2))

max=ceiling(avg*(1+0.2))

即所有regionserver上的regions个数都在min和max之间的话,就不会执行balancer。

有没有方法让table手动split出来的regions分布均衡呢?请知道的筒子留言告诉我一声哦。

==============================================================================

以上是原文链接的作者想法:下面是我的重点测试:

重点:默认情况下是针对整个集群的region分布来均衡的,也可以针对表的region来均衡,需要配置:

<property>
<name>hbase.master.loadbalance.bytable</name>
<value>true</value>
</property>

然后重启集群。

再执行hbaseadmin.balancer()。可以发现分布在一个regionserver上的一个表的regions被均匀的分布在所有的regionserver上了。
 

首先重现表的region分布在每个rs上不均匀的情况:

(1)jar包创建:核心代码如下:指定100个region

 public static void createRegions(int regionNum, String tablename)
            throws IOException {
        short start = (short) (0x7FFF / regionNum);
        short end = (short) (0x7FFF - start);
        desc = new HTableDescriptor(TableName.valueOf(tablename));
        desc.addFamily(hd);
        admin.createTable(desc, Bytes.toBytes(start), Bytes.toBytes(end),
                regionNum);
        System.out.println("Create table " + desc.getTableName() + " on "
                + CONF.get("zookeeper.znode.parent"));
    }

 观察表的region分布情况:分布均衡

 (2)hbase shell创建:40region

n_splits = 40
create 'table2', {NAME => 'cf', COMPRESSION => 'NONE'}, {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}}

 观察table2表的region分布情况:分布均衡

 如上,感觉不能再现表的region分布在rs不均衡的场景。

(3)最后一招,重启集群,注意为了确保出现region不均匀分布的场景,要手动重启每个节点的进程(其实手动先重启一个rs和master基本 所有region就会跑到先启动的这台region)

重启后:region分布如下:

明显不均衡,只在一台机器,然后看看表的region分布,发现也是只在一台机器:

 

(4)此时做balancer:

hbase(main):001:0>  balancer
true                                                                                                                                
0 row(s) in 43.5350 seconds

观察页面总体region分布:

观察表region分布,明显不均衡:

(5)我们改一下配置再去重启集群:

hbase-site.xml中添加如下,然后分发:

<property>
<name>hbase.master.loadbalance.bytable</name>
<value>true</value>
</property>

依照(3)重启集群,观察表:

至此表级balancer测试完成。 

猜你喜欢

转载自blog.csdn.net/qq_35440040/article/details/84658309