You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2011/03/04 16:51:12 UTC
svn commit: r1078021 - in /hbase/branches/0.90: CHANGES.txt
src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
Author: apurtell
Date: Fri Mar 4 15:51:12 2011
New Revision: 1078021
URL: http://svn.apache.org/viewvc?rev=1078021&view=rev
Log:
HBASE-3586 Improve the selection of regions to balance
Modified:
hbase/branches/0.90/CHANGES.txt
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
Modified: hbase/branches/0.90/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.90/CHANGES.txt?rev=1078021&r1=1078020&r2=1078021&view=diff
==============================================================================
--- hbase/branches/0.90/CHANGES.txt (original)
+++ hbase/branches/0.90/CHANGES.txt Fri Mar 4 15:51:12 2011
@@ -19,7 +19,9 @@ Release 0.90.2 - February 9th, 2011
IMPROVEMENTS
HBASE-3542 MultiGet methods in Thrift
-
+ HBASE-3586 Improve the selection of regions to balance (Ted Yu via Andrew
+ Purtell)
+
Release 0.90.1 - February 9th, 2011
Modified: hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java?rev=1078021&r1=1078020&r2=1078021&view=diff
==============================================================================
--- hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java (original)
+++ hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java Fri Mar 4 15:51:12 2011
@@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.master;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -59,6 +60,17 @@ public class LoadBalancer {
private static final Log LOG = LogFactory.getLog(LoadBalancer.class);
private static final Random rand = new Random();
+ static class RegionPlanComparator implements Comparator<RegionPlan> {
+ @Override
+ public int compare(RegionPlan l, RegionPlan r) {
+ long diff = r.getRegionInfo().getRegionId() - l.getRegionInfo().getRegionId();
+ if (diff < 0) return -1;
+ if (diff > 0) return 1;
+ return 0;
+ }
+ }
+ static RegionPlanComparator rpComparator = new RegionPlanComparator();
+
/**
* Generate a global load balancing plan according to the specified map of
* server information to the most loaded regions of each server.
@@ -77,6 +89,8 @@ public class LoadBalancer {
* <li>Iterate down the most loaded servers, shedding regions from each so
* each server hosts exactly <b>MAX</b> regions. Stop once you reach a
* server that already has <= <b>MAX</b> regions.
+ * <p>
+ * Order the regions to move from most recent to least.
*
* <li>Iterate down the least loaded servers, assigning regions so each server
* has exactly </b>MIN</b> regions. Stop once you reach a server that
@@ -184,7 +198,8 @@ public class LoadBalancer {
List<HRegionInfo> regions = server.getValue();
int numToOffload = Math.min(regionCount - max, regions.size());
int numTaken = 0;
- for (HRegionInfo hri: regions) {
+ for (int i = regions.size() - 1; i >= 0; i--) {
+ HRegionInfo hri = regions.get(i);
// Don't rebalance meta regions.
if (hri.isMetaRegion()) continue;
regionsToMove.add(new RegionPlan(hri, serverInfo, null));
@@ -194,6 +209,8 @@ public class LoadBalancer {
serverBalanceInfo.put(serverInfo,
new BalanceInfo(numToOffload, (-1)*numTaken));
}
+ // put young regions at the beginning of regionsToMove
+ Collections.sort(regionsToMove, rpComparator);
// Walk down least loaded, filling each to the min
int serversUnderloaded = 0; // number of servers that get new regions