diff --git src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 8809017..f0483d6 100644 --- src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -1578,6 +1578,16 @@ public class HBaseAdmin implements Abortable, Closeable { throws MasterNotRunningException, ZooKeeperConnectionException { return getMaster().balance(); } + + /** + * Balance region of a table + * @param tableName tableName + * @return True if balancer ran, false otherwise. + */ + public boolean balancer(final byte[] tableName) throws MasterNotRunningException, + ZooKeeperConnectionException { + return getMaster().balance(tableName); + } /** * Split a table or an individual region. diff --git src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java index 3dc6ba0..4a96098 100644 --- src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java +++ src/main/java/org/apache/hadoop/hbase/ipc/HMasterInterface.java @@ -243,6 +243,13 @@ public interface HMasterInterface extends VersionedProtocol { public boolean balance(); /** + * Balance the regions of a table. + * @param tableName tableName + * @return True if balancer ran, false otherwise. + */ + public boolean balance(final byte[] tableName); + + /** * Turn the load balancer on or off. * @param b If true, enable balancer. If false, disable balancer. * @return Previous balancer value diff --git src/main/java/org/apache/hadoop/hbase/master/HMaster.java src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 6be1bea..cb86e7f 100644 --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -1145,6 +1145,11 @@ Server { @Override public boolean balance() { + return balance(null); + } + + @Override + public boolean balance(final byte[] tableName) { // if master not initialized, don't run balancer. if (!this.initialized) { LOG.debug("Master has not been initialized, don't run balancer."); @@ -1188,9 +1193,18 @@ Server { this.assignmentManager.getAssignmentsByTable(); List plans = new ArrayList(); - for (Map> assignments : assignmentsByTable.values()) { - List partialPlans = this.balancer.balanceCluster(assignments); - if (partialPlans != null) plans.addAll(partialPlans); + + if (tableName != null) { + String tableNameString = Bytes.toString(tableName); + if (assignmentsByTable.containsKey(tableNameString)) { + Map> serverRegionsMap = assignmentsByTable.get(tableNameString); + plans.addAll(this.balancer.balanceCluster(serverRegionsMap)); + } + } else { + for (Map> assignments : assignmentsByTable.values()) { + List partialPlans = this.balancer.balanceCluster(assignments); + if (partialPlans != null) plans.addAll(partialPlans); + } } int rpCount = 0; // number of RegionPlans balanced so far long totalRegPlanExecTime = 0; diff --git src/main/ruby/hbase/admin.rb src/main/ruby/hbase/admin.rb index 4ad3d88..eb67533 100644 --- src/main/ruby/hbase/admin.rb +++ src/main/ruby/hbase/admin.rb @@ -103,8 +103,12 @@ module Hbase #---------------------------------------------------------------------------------------------- # Requests a cluster balance # Returns true if balancer ran - def balancer() - @admin.balancer() + def balancer(table_name = nil) + if table_name == nil + @admin.balancer() + else + @admin.balancer(Bytes.toBytes(table_name)) + end end #---------------------------------------------------------------------------------------------- diff --git src/main/ruby/shell/commands/balancer.rb src/main/ruby/shell/commands/balancer.rb index 05ecd3a..88ee31c 100644 --- src/main/ruby/shell/commands/balancer.rb +++ src/main/ruby/shell/commands/balancer.rb @@ -23,16 +23,20 @@ module Shell class Balancer < Command def help return <<-EOF -Trigger the cluster balancer. Returns true if balancer ran and was able to -tell the region servers to unassign all the regions to balance (the re-assignment itself is async). -Otherwise false (Will not run if regions in transition). +Trigger the cluster balancer or the table balancer if table name is sepecified. Returns true if +balancer ran and was able to tell the region servers to unassign all the regions to balance +(the re-assignment itself is async). Otherwise false (Will not run if regions in transition). +Examples: + + hbase> balancer # trigger cluster balancer + hbase> balancer 'TABLENAME' # trigger table balancer EOF end - def command() + def command(table_name = nil) format_simple_command do formatter.row([ - admin.balancer()? "true": "false" + admin.balancer(table_name)? "true": "false" ]) end end