HBase源码分析4—Region Balance
易于水平拓展是HBase高性能的重要原因之一。但是随着数据分散到不同节点,容易出现数据倾斜的问题,使得整个集群的效率下降。本章详细讨论下HBase中负载均衡的问题。
入口
在HBase源码分析3—HMaster启动过程中提到过,在HMaster启动的最后阶段 finishActiveMasterInitialization 中,HBase会启动一些定时任务,其中就包括负责Region负载均衡的BalanceChore
1 2 3 4 5 |
// HMaster.java line:828 //initialize load balancer this.balancer.setMasterServices(this); this.balancer.setClusterStatus(getClusterStatusWithoutCoprocessor()); this.balancer.initialize(); |
而balancer对象是在 initializeZKBasedSystemTrackers 中产生的
1 |
this.balancer = LoadBalancerFactory.getLoadBalancer(conf); |
HBase提供了很多种Balancer,曾经默认的叫 SimpleLoadBalancer ,现在默认的是 StochasticLoadBalancer (随机梯度……啊不是,随机负载均衡)。两种balancer的实现都在包 org.apache.hadoop.hbase.master.balancer 中。
Balance过程
BalanceChore 通过调用 HMaster.balance() 来启动balance过程。
首先函数做了一些检查,看集群是否满足做balance的条件,比如正在进行region splitting的时候就不能进行balance,有其他balance进行的时候也不能再进行balance( this.balancer 是用 syncroniz