Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.2.0
-
None
Description
now can not achieve overallbalanced when use rsgroup balancer and by table is on,
because balance every table actually use the clusterload only contain one table's load.
we should use clusterload contain all this rsgroup table's load to balance overall
hbase/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
public boolean balance(boolean force) throws IOException { ...... boolean isByTable = getConfiguration().getBoolean("hbase.master.loadbalance.bytable", false); Map<TableName, Map<ServerName, List<RegionInfo>>> assignments = this.assignmentManager.getRegionStates() .getAssignmentsForBalancer(tableStateManager, this.serverManager.getOnlineServersList(), isByTable); for (Map<ServerName, List<RegionInfo>> serverMap : assignments.values()) { serverMap.keySet().removeAll(this.serverManager.getDrainingServersList()); } //Give the balancer the current cluster state. this.balancer.setClusterMetrics(getClusterMetricsWithoutCoprocessor()); this.balancer.setClusterLoad(assignments); List<RegionPlan> plans = new ArrayList<>(); for (Entry<TableName, Map<ServerName, List<RegionInfo>>> e : assignments.entrySet()) { List<RegionPlan> partialPlans = this.balancer.balanceCluster(e.getKey(), e.getValue()); if (partialPlans != null) { plans.addAll(partialPlans); } }
now do refactor:
- add method 'balanceTable' in interface LoadBalancer
- SimpleLoadBalancer and StochasticLoadBalancer do the real 'balanceTable' , and 'balanceTable' is not support in BaseLoadBalancer and RSGroupBasedLoadBalancer
- RSGroupBasedLoadBalancer invoke balanceCluster , and pass GroupClusterLoad to internal balacer by group
- internal balancer balance cluster invoke 'balanceTable'