diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java index f2fc958..dfcb1b9 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java @@ -781,6 +781,16 @@ public interface Admin extends Abortable, Closeable { boolean balancer() throws IOException; /** + * Invoke the balancer. Will run the balancer and if regions to move, it will + * go ahead and do the reassignments. If there is region in transition, force parameter of true + * would still run balancer. Can *not* run for other reasons. Check + * logs. + * @param force whether we should force balance even if there is region in transition + * @return True if balancer ran, false otherwise. + */ + boolean balancer(boolean force) throws IOException; + + /** * Query the current state of the balancer * * @return true if the balancer is enabled, false otherwise. diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 7ed303d..dcbe8e2 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -2153,7 +2153,25 @@ public class HBaseAdmin implements Admin { return executeCallable(new MasterCallable(getConnection()) { @Override public Boolean call(int callTimeout) throws ServiceException { - return master.balance(null, RequestConverter.buildBalanceRequest()).getBalancerRan(); + return master.balance(null, RequestConverter.buildBalanceRequest(false)).getBalancerRan(); + } + }); + } + + /** + * Invoke the balancer. Will run the balancer and if regions to move, it will + * go ahead and do the reassignments. If there is region in transition, force parameter of true + * would still run balancer. Can *not* run for other reasons. Check + * logs. + * @param force whether we should force balance even if there is region in transition + * @return True if balancer ran, false otherwise. + */ + @Override + public boolean balancer(final boolean force) throws IOException { + return executeCallable(new MasterCallable(getConnection()) { + @Override + public Boolean call(int callTimeout) throws ServiceException { + return master.balance(null, RequestConverter.buildBalanceRequest(force)).getBalancerRan(); } }); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index c111be2..cc411a6 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -1351,8 +1351,8 @@ public final class RequestConverter { * * @return a BalanceRequest */ - public static BalanceRequest buildBalanceRequest() { - return BalanceRequest.newBuilder().build(); + public static BalanceRequest buildBalanceRequest(boolean force) { + return BalanceRequest.newBuilder().setForce(force).build(); } /** diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java index eb98b42..711b6d7 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java @@ -25028,6 +25028,16 @@ public final class MasterProtos { public interface BalanceRequestOrBuilder extends com.google.protobuf.MessageOrBuilder { + + // optional bool force = 1; + /** + * optional bool force = 1; + */ + boolean hasForce(); + /** + * optional bool force = 1; + */ + boolean getForce(); } /** * Protobuf type {@code hbase.pb.BalanceRequest} @@ -25062,6 +25072,7 @@ public final class MasterProtos { com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { initFields(); + int mutable_bitField0_ = 0; com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); try { @@ -25079,6 +25090,11 @@ public final class MasterProtos { } break; } + case 8: { + bitField0_ |= 0x00000001; + force_ = input.readBool(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -25118,7 +25134,25 @@ public final class MasterProtos { return PARSER; } + private int bitField0_; + // optional bool force = 1; + public static final int FORCE_FIELD_NUMBER = 1; + private boolean force_; + /** + * optional bool force = 1; + */ + public boolean hasForce() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool force = 1; + */ + public boolean getForce() { + return force_; + } + private void initFields() { + force_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -25132,6 +25166,9 @@ public final class MasterProtos { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBool(1, force_); + } getUnknownFields().writeTo(output); } @@ -25141,6 +25178,10 @@ public final class MasterProtos { if (size != -1) return size; size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, force_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -25164,6 +25205,11 @@ public final class MasterProtos { org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest other = (org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest) obj; boolean result = true; + result = result && (hasForce() == other.hasForce()); + if (hasForce()) { + result = result && (getForce() + == other.getForce()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -25177,6 +25223,10 @@ public final class MasterProtos { } int hash = 41; hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasForce()) { + hash = (37 * hash) + FORCE_FIELD_NUMBER; + hash = (53 * hash) + hashBoolean(getForce()); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -25286,6 +25336,8 @@ public final class MasterProtos { public Builder clear() { super.clear(); + force_ = false; + bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -25312,6 +25364,13 @@ public final class MasterProtos { public org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest buildPartial() { org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest result = new org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.force_ = force_; + result.bitField0_ = to_bitField0_; onBuilt(); return result; } @@ -25327,6 +25386,9 @@ public final class MasterProtos { public Builder mergeFrom(org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest other) { if (other == org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest.getDefaultInstance()) return this; + if (other.hasForce()) { + setForce(other.getForce()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -25352,6 +25414,40 @@ public final class MasterProtos { } return this; } + private int bitField0_; + + // optional bool force = 1; + private boolean force_ ; + /** + * optional bool force = 1; + */ + public boolean hasForce() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool force = 1; + */ + public boolean getForce() { + return force_; + } + /** + * optional bool force = 1; + */ + public Builder setForce(boolean value) { + bitField0_ |= 0x00000001; + force_ = value; + onChanged(); + return this; + } + /** + * optional bool force = 1; + */ + public Builder clearForce() { + bitField0_ = (bitField0_ & ~0x00000001); + force_ = false; + onChanged(); + return this; + } // @@protoc_insertion_point(builder_scope:hbase.pb.BalanceRequest) } @@ -56066,208 +56162,209 @@ public final class MasterProtos { "sponse\022&\n\ttableName\030\001 \003(\0132\023.hbase.pb.Tab" + "leName\"\021\n\017ShutdownRequest\"\022\n\020ShutdownRes" + "ponse\"\023\n\021StopMasterRequest\"\024\n\022StopMaster" + - "Response\"\020\n\016BalanceRequest\"\'\n\017BalanceRes", - "ponse\022\024\n\014balancer_ran\030\001 \002(\010\"<\n\031SetBalanc" + - "erRunningRequest\022\n\n\002on\030\001 \002(\010\022\023\n\013synchron" + - "ous\030\002 \001(\010\"8\n\032SetBalancerRunningResponse\022" + - "\032\n\022prev_balance_value\030\001 \001(\010\"\032\n\030IsBalance" + - "rEnabledRequest\",\n\031IsBalancerEnabledResp" + - "onse\022\017\n\007enabled\030\001 \002(\010\"\027\n\025RunCatalogScanR" + - "equest\"-\n\026RunCatalogScanResponse\022\023\n\013scan" + - "_result\030\001 \001(\005\"-\n\033EnableCatalogJanitorReq" + - "uest\022\016\n\006enable\030\001 \002(\010\"2\n\034EnableCatalogJan" + - "itorResponse\022\022\n\nprev_value\030\001 \001(\010\" \n\036IsCa", - "talogJanitorEnabledRequest\"0\n\037IsCatalogJ" + - "anitorEnabledResponse\022\r\n\005value\030\001 \002(\010\"B\n\017" + - "SnapshotRequest\022/\n\010snapshot\030\001 \002(\0132\035.hbas" + - "e.pb.SnapshotDescription\",\n\020SnapshotResp" + - "onse\022\030\n\020expected_timeout\030\001 \002(\003\"\036\n\034GetCom" + - "pletedSnapshotsRequest\"Q\n\035GetCompletedSn" + - "apshotsResponse\0220\n\tsnapshots\030\001 \003(\0132\035.hba" + - "se.pb.SnapshotDescription\"H\n\025DeleteSnaps" + - "hotRequest\022/\n\010snapshot\030\001 \002(\0132\035.hbase.pb." + - "SnapshotDescription\"\030\n\026DeleteSnapshotRes", - "ponse\"I\n\026RestoreSnapshotRequest\022/\n\010snaps" + - "hot\030\001 \002(\0132\035.hbase.pb.SnapshotDescription" + - "\"\031\n\027RestoreSnapshotResponse\"H\n\025IsSnapsho" + - "tDoneRequest\022/\n\010snapshot\030\001 \001(\0132\035.hbase.p" + - "b.SnapshotDescription\"^\n\026IsSnapshotDoneR" + - "esponse\022\023\n\004done\030\001 \001(\010:\005false\022/\n\010snapshot" + - "\030\002 \001(\0132\035.hbase.pb.SnapshotDescription\"O\n" + - "\034IsRestoreSnapshotDoneRequest\022/\n\010snapsho" + - "t\030\001 \001(\0132\035.hbase.pb.SnapshotDescription\"4" + - "\n\035IsRestoreSnapshotDoneResponse\022\023\n\004done\030", - "\001 \001(\010:\005false\"F\n\033GetSchemaAlterStatusRequ" + + "Response\"\037\n\016BalanceRequest\022\r\n\005force\030\001 \001(", + "\010\"\'\n\017BalanceResponse\022\024\n\014balancer_ran\030\001 \002" + + "(\010\"<\n\031SetBalancerRunningRequest\022\n\n\002on\030\001 " + + "\002(\010\022\023\n\013synchronous\030\002 \001(\010\"8\n\032SetBalancerR" + + "unningResponse\022\032\n\022prev_balance_value\030\001 \001" + + "(\010\"\032\n\030IsBalancerEnabledRequest\",\n\031IsBala" + + "ncerEnabledResponse\022\017\n\007enabled\030\001 \002(\010\"\027\n\025" + + "RunCatalogScanRequest\"-\n\026RunCatalogScanR" + + "esponse\022\023\n\013scan_result\030\001 \001(\005\"-\n\033EnableCa" + + "talogJanitorRequest\022\016\n\006enable\030\001 \002(\010\"2\n\034E" + + "nableCatalogJanitorResponse\022\022\n\nprev_valu", + "e\030\001 \001(\010\" \n\036IsCatalogJanitorEnabledReques" + + "t\"0\n\037IsCatalogJanitorEnabledResponse\022\r\n\005" + + "value\030\001 \002(\010\"B\n\017SnapshotRequest\022/\n\010snapsh" + + "ot\030\001 \002(\0132\035.hbase.pb.SnapshotDescription\"" + + ",\n\020SnapshotResponse\022\030\n\020expected_timeout\030" + + "\001 \002(\003\"\036\n\034GetCompletedSnapshotsRequest\"Q\n" + + "\035GetCompletedSnapshotsResponse\0220\n\tsnapsh" + + "ots\030\001 \003(\0132\035.hbase.pb.SnapshotDescription" + + "\"H\n\025DeleteSnapshotRequest\022/\n\010snapshot\030\001 " + + "\002(\0132\035.hbase.pb.SnapshotDescription\"\030\n\026De", + "leteSnapshotResponse\"I\n\026RestoreSnapshotR" + + "equest\022/\n\010snapshot\030\001 \002(\0132\035.hbase.pb.Snap" + + "shotDescription\"\031\n\027RestoreSnapshotRespon" + + "se\"H\n\025IsSnapshotDoneRequest\022/\n\010snapshot\030" + + "\001 \001(\0132\035.hbase.pb.SnapshotDescription\"^\n\026" + + "IsSnapshotDoneResponse\022\023\n\004done\030\001 \001(\010:\005fa" + + "lse\022/\n\010snapshot\030\002 \001(\0132\035.hbase.pb.Snapsho" + + "tDescription\"O\n\034IsRestoreSnapshotDoneReq" + + "uest\022/\n\010snapshot\030\001 \001(\0132\035.hbase.pb.Snapsh" + + "otDescription\"4\n\035IsRestoreSnapshotDoneRe", + "sponse\022\023\n\004done\030\001 \001(\010:\005false\"F\n\033GetSchema" + + "AlterStatusRequest\022\'\n\ntable_name\030\001 \002(\0132\023" + + ".hbase.pb.TableName\"T\n\034GetSchemaAlterSta" + + "tusResponse\022\035\n\025yet_to_update_regions\030\001 \001" + + "(\r\022\025\n\rtotal_regions\030\002 \001(\r\"\213\001\n\032GetTableDe" + + "scriptorsRequest\022(\n\013table_names\030\001 \003(\0132\023." + + "hbase.pb.TableName\022\r\n\005regex\030\002 \001(\t\022!\n\022inc" + + "lude_sys_tables\030\003 \001(\010:\005false\022\021\n\tnamespac" + + "e\030\004 \001(\t\"J\n\033GetTableDescriptorsResponse\022+" + + "\n\014table_schema\030\001 \003(\0132\025.hbase.pb.TableSch", + "ema\"[\n\024GetTableNamesRequest\022\r\n\005regex\030\001 \001" + + "(\t\022!\n\022include_sys_tables\030\002 \001(\010:\005false\022\021\n" + + "\tnamespace\030\003 \001(\t\"A\n\025GetTableNamesRespons" + + "e\022(\n\013table_names\030\001 \003(\0132\023.hbase.pb.TableN" + + "ame\"?\n\024GetTableStateRequest\022\'\n\ntable_nam" + + "e\030\001 \002(\0132\023.hbase.pb.TableName\"B\n\025GetTable" + + "StateResponse\022)\n\013table_state\030\001 \002(\0132\024.hba" + + "se.pb.TableState\"\031\n\027GetClusterStatusRequ" + + "est\"K\n\030GetClusterStatusResponse\022/\n\016clust" + + "er_status\030\001 \002(\0132\027.hbase.pb.ClusterStatus", + "\"\030\n\026IsMasterRunningRequest\"4\n\027IsMasterRu" + + "nningResponse\022\031\n\021is_master_running\030\001 \002(\010" + + "\"I\n\024ExecProcedureRequest\0221\n\tprocedure\030\001 " + + "\002(\0132\036.hbase.pb.ProcedureDescription\"F\n\025E" + + "xecProcedureResponse\022\030\n\020expected_timeout" + + "\030\001 \001(\003\022\023\n\013return_data\030\002 \001(\014\"K\n\026IsProcedu" + + "reDoneRequest\0221\n\tprocedure\030\001 \001(\0132\036.hbase" + + ".pb.ProcedureDescription\"`\n\027IsProcedureD" + + "oneResponse\022\023\n\004done\030\001 \001(\010:\005false\0220\n\010snap" + + "shot\030\002 \001(\0132\036.hbase.pb.ProcedureDescripti", + "on\",\n\031GetProcedureResultRequest\022\017\n\007proc_" + + "id\030\001 \002(\004\"\371\001\n\032GetProcedureResultResponse\022" + + "9\n\005state\030\001 \002(\0162*.hbase.pb.GetProcedureRe" + + "sultResponse.State\022\022\n\nstart_time\030\002 \001(\004\022\023" + + "\n\013last_update\030\003 \001(\004\022\016\n\006result\030\004 \001(\014\0224\n\te" + + "xception\030\005 \001(\0132!.hbase.pb.ForeignExcepti" + + "onMessage\"1\n\005State\022\r\n\tNOT_FOUND\020\000\022\013\n\007RUN" + + "NING\020\001\022\014\n\010FINISHED\020\002\"\315\001\n\017SetQuotaRequest" + + "\022\021\n\tuser_name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t\022" + + "\021\n\tnamespace\030\003 \001(\t\022\'\n\ntable_name\030\004 \001(\0132\023", + ".hbase.pb.TableName\022\022\n\nremove_all\030\005 \001(\010\022" + + "\026\n\016bypass_globals\030\006 \001(\010\022+\n\010throttle\030\007 \001(" + + "\0132\031.hbase.pb.ThrottleRequest\"\022\n\020SetQuota" + + "Response\"J\n\037MajorCompactionTimestampRequ" + "est\022\'\n\ntable_name\030\001 \002(\0132\023.hbase.pb.Table" + - "Name\"T\n\034GetSchemaAlterStatusResponse\022\035\n\025" + - "yet_to_update_regions\030\001 \001(\r\022\025\n\rtotal_reg" + - "ions\030\002 \001(\r\"\213\001\n\032GetTableDescriptorsReques" + - "t\022(\n\013table_names\030\001 \003(\0132\023.hbase.pb.TableN" + - "ame\022\r\n\005regex\030\002 \001(\t\022!\n\022include_sys_tables" + - "\030\003 \001(\010:\005false\022\021\n\tnamespace\030\004 \001(\t\"J\n\033GetT" + - "ableDescriptorsResponse\022+\n\014table_schema\030" + - "\001 \003(\0132\025.hbase.pb.TableSchema\"[\n\024GetTable", - "NamesRequest\022\r\n\005regex\030\001 \001(\t\022!\n\022include_s" + - "ys_tables\030\002 \001(\010:\005false\022\021\n\tnamespace\030\003 \001(" + - "\t\"A\n\025GetTableNamesResponse\022(\n\013table_name" + - "s\030\001 \003(\0132\023.hbase.pb.TableName\"?\n\024GetTable" + - "StateRequest\022\'\n\ntable_name\030\001 \002(\0132\023.hbase" + - ".pb.TableName\"B\n\025GetTableStateResponse\022)" + - "\n\013table_state\030\001 \002(\0132\024.hbase.pb.TableStat" + - "e\"\031\n\027GetClusterStatusRequest\"K\n\030GetClust" + - "erStatusResponse\022/\n\016cluster_status\030\001 \002(\013" + - "2\027.hbase.pb.ClusterStatus\"\030\n\026IsMasterRun", - "ningRequest\"4\n\027IsMasterRunningResponse\022\031" + - "\n\021is_master_running\030\001 \002(\010\"I\n\024ExecProcedu" + - "reRequest\0221\n\tprocedure\030\001 \002(\0132\036.hbase.pb." + - "ProcedureDescription\"F\n\025ExecProcedureRes" + - "ponse\022\030\n\020expected_timeout\030\001 \001(\003\022\023\n\013retur" + - "n_data\030\002 \001(\014\"K\n\026IsProcedureDoneRequest\0221" + - "\n\tprocedure\030\001 \001(\0132\036.hbase.pb.ProcedureDe" + - "scription\"`\n\027IsProcedureDoneResponse\022\023\n\004" + - "done\030\001 \001(\010:\005false\0220\n\010snapshot\030\002 \001(\0132\036.hb" + - "ase.pb.ProcedureDescription\",\n\031GetProced", - "ureResultRequest\022\017\n\007proc_id\030\001 \002(\004\"\371\001\n\032Ge" + - "tProcedureResultResponse\0229\n\005state\030\001 \002(\0162" + - "*.hbase.pb.GetProcedureResultResponse.St" + - "ate\022\022\n\nstart_time\030\002 \001(\004\022\023\n\013last_update\030\003" + - " \001(\004\022\016\n\006result\030\004 \001(\014\0224\n\texception\030\005 \001(\0132" + - "!.hbase.pb.ForeignExceptionMessage\"1\n\005St" + - "ate\022\r\n\tNOT_FOUND\020\000\022\013\n\007RUNNING\020\001\022\014\n\010FINIS" + - "HED\020\002\"\315\001\n\017SetQuotaRequest\022\021\n\tuser_name\030\001" + - " \001(\t\022\022\n\nuser_group\030\002 \001(\t\022\021\n\tnamespace\030\003 " + - "\001(\t\022\'\n\ntable_name\030\004 \001(\0132\023.hbase.pb.Table", - "Name\022\022\n\nremove_all\030\005 \001(\010\022\026\n\016bypass_globa" + - "ls\030\006 \001(\010\022+\n\010throttle\030\007 \001(\0132\031.hbase.pb.Th" + - "rottleRequest\"\022\n\020SetQuotaResponse\"J\n\037Maj" + - "orCompactionTimestampRequest\022\'\n\ntable_na" + - "me\030\001 \002(\0132\023.hbase.pb.TableName\"U\n(MajorCo" + - "mpactionTimestampForRegionRequest\022)\n\006reg" + - "ion\030\001 \002(\0132\031.hbase.pb.RegionSpecifier\"@\n " + - "MajorCompactionTimestampResponse\022\034\n\024comp" + - "action_timestamp\030\001 \002(\003\"\035\n\033SecurityCapabi" + - "litiesRequest\"\354\001\n\034SecurityCapabilitiesRe", - "sponse\022G\n\014capabilities\030\001 \003(\01621.hbase.pb." + - "SecurityCapabilitiesResponse.Capability\"" + - "\202\001\n\nCapability\022\031\n\025SIMPLE_AUTHENTICATION\020" + - "\000\022\031\n\025SECURE_AUTHENTICATION\020\001\022\021\n\rAUTHORIZ" + - "ATION\020\002\022\026\n\022CELL_AUTHORIZATION\020\003\022\023\n\017CELL_" + - "VISIBILITY\020\0042\301#\n\rMasterService\022e\n\024GetSch" + - "emaAlterStatus\022%.hbase.pb.GetSchemaAlter" + - "StatusRequest\032&.hbase.pb.GetSchemaAlterS" + - "tatusResponse\022b\n\023GetTableDescriptors\022$.h" + - "base.pb.GetTableDescriptorsRequest\032%.hba", - "se.pb.GetTableDescriptorsResponse\022P\n\rGet" + - "TableNames\022\036.hbase.pb.GetTableNamesReque" + - "st\032\037.hbase.pb.GetTableNamesResponse\022Y\n\020G" + - "etClusterStatus\022!.hbase.pb.GetClusterSta" + - "tusRequest\032\".hbase.pb.GetClusterStatusRe" + - "sponse\022V\n\017IsMasterRunning\022 .hbase.pb.IsM" + - "asterRunningRequest\032!.hbase.pb.IsMasterR" + - "unningResponse\022D\n\tAddColumn\022\032.hbase.pb.A" + - "ddColumnRequest\032\033.hbase.pb.AddColumnResp" + - "onse\022M\n\014DeleteColumn\022\035.hbase.pb.DeleteCo", - "lumnRequest\032\036.hbase.pb.DeleteColumnRespo" + - "nse\022M\n\014ModifyColumn\022\035.hbase.pb.ModifyCol" + - "umnRequest\032\036.hbase.pb.ModifyColumnRespon" + - "se\022G\n\nMoveRegion\022\033.hbase.pb.MoveRegionRe" + - "quest\032\034.hbase.pb.MoveRegionResponse\022k\n\026D" + - "ispatchMergingRegions\022\'.hbase.pb.Dispatc" + - "hMergingRegionsRequest\032(.hbase.pb.Dispat" + - "chMergingRegionsResponse\022M\n\014AssignRegion" + - "\022\035.hbase.pb.AssignRegionRequest\032\036.hbase." + - "pb.AssignRegionResponse\022S\n\016UnassignRegio", - "n\022\037.hbase.pb.UnassignRegionRequest\032 .hba" + - "se.pb.UnassignRegionResponse\022P\n\rOfflineR" + - "egion\022\036.hbase.pb.OfflineRegionRequest\032\037." + - "hbase.pb.OfflineRegionResponse\022J\n\013Delete" + - "Table\022\034.hbase.pb.DeleteTableRequest\032\035.hb" + - "ase.pb.DeleteTableResponse\022P\n\rtruncateTa" + - "ble\022\036.hbase.pb.TruncateTableRequest\032\037.hb" + - "ase.pb.TruncateTableResponse\022J\n\013EnableTa" + - "ble\022\034.hbase.pb.EnableTableRequest\032\035.hbas" + - "e.pb.EnableTableResponse\022M\n\014DisableTable", - "\022\035.hbase.pb.DisableTableRequest\032\036.hbase." + - "pb.DisableTableResponse\022J\n\013ModifyTable\022\034" + - ".hbase.pb.ModifyTableRequest\032\035.hbase.pb." + - "ModifyTableResponse\022J\n\013CreateTable\022\034.hba" + - "se.pb.CreateTableRequest\032\035.hbase.pb.Crea" + - "teTableResponse\022A\n\010Shutdown\022\031.hbase.pb.S" + - "hutdownRequest\032\032.hbase.pb.ShutdownRespon" + - "se\022G\n\nStopMaster\022\033.hbase.pb.StopMasterRe" + - "quest\032\034.hbase.pb.StopMasterResponse\022>\n\007B" + - "alance\022\030.hbase.pb.BalanceRequest\032\031.hbase", - ".pb.BalanceResponse\022_\n\022SetBalancerRunnin" + - "g\022#.hbase.pb.SetBalancerRunningRequest\032$" + - ".hbase.pb.SetBalancerRunningResponse\022\\\n\021" + - "IsBalancerEnabled\022\".hbase.pb.IsBalancerE" + - "nabledRequest\032#.hbase.pb.IsBalancerEnabl" + - "edResponse\022S\n\016RunCatalogScan\022\037.hbase.pb." + - "RunCatalogScanRequest\032 .hbase.pb.RunCata" + - "logScanResponse\022e\n\024EnableCatalogJanitor\022" + - "%.hbase.pb.EnableCatalogJanitorRequest\032&" + - ".hbase.pb.EnableCatalogJanitorResponse\022n", - "\n\027IsCatalogJanitorEnabled\022(.hbase.pb.IsC" + - "atalogJanitorEnabledRequest\032).hbase.pb.I" + - "sCatalogJanitorEnabledResponse\022^\n\021ExecMa" + - "sterService\022#.hbase.pb.CoprocessorServic" + - "eRequest\032$.hbase.pb.CoprocessorServiceRe" + - "sponse\022A\n\010Snapshot\022\031.hbase.pb.SnapshotRe" + - "quest\032\032.hbase.pb.SnapshotResponse\022h\n\025Get" + - "CompletedSnapshots\022&.hbase.pb.GetComplet" + - "edSnapshotsRequest\032\'.hbase.pb.GetComplet" + - "edSnapshotsResponse\022S\n\016DeleteSnapshot\022\037.", - "hbase.pb.DeleteSnapshotRequest\032 .hbase.p" + - "b.DeleteSnapshotResponse\022S\n\016IsSnapshotDo" + - "ne\022\037.hbase.pb.IsSnapshotDoneRequest\032 .hb" + - "ase.pb.IsSnapshotDoneResponse\022V\n\017Restore" + - "Snapshot\022 .hbase.pb.RestoreSnapshotReque" + - "st\032!.hbase.pb.RestoreSnapshotResponse\022h\n" + - "\025IsRestoreSnapshotDone\022&.hbase.pb.IsRest" + - "oreSnapshotDoneRequest\032\'.hbase.pb.IsRest" + - "oreSnapshotDoneResponse\022P\n\rExecProcedure" + - "\022\036.hbase.pb.ExecProcedureRequest\032\037.hbase", - ".pb.ExecProcedureResponse\022W\n\024ExecProcedu" + - "reWithRet\022\036.hbase.pb.ExecProcedureReques" + - "t\032\037.hbase.pb.ExecProcedureResponse\022V\n\017Is" + - "ProcedureDone\022 .hbase.pb.IsProcedureDone" + - "Request\032!.hbase.pb.IsProcedureDoneRespon" + - "se\022V\n\017ModifyNamespace\022 .hbase.pb.ModifyN" + - "amespaceRequest\032!.hbase.pb.ModifyNamespa" + - "ceResponse\022V\n\017CreateNamespace\022 .hbase.pb" + - ".CreateNamespaceRequest\032!.hbase.pb.Creat" + - "eNamespaceResponse\022V\n\017DeleteNamespace\022 .", - "hbase.pb.DeleteNamespaceRequest\032!.hbase." + - "pb.DeleteNamespaceResponse\022k\n\026GetNamespa" + - "ceDescriptor\022\'.hbase.pb.GetNamespaceDesc" + - "riptorRequest\032(.hbase.pb.GetNamespaceDes" + - "criptorResponse\022q\n\030ListNamespaceDescript" + - "ors\022).hbase.pb.ListNamespaceDescriptorsR" + - "equest\032*.hbase.pb.ListNamespaceDescripto" + - "rsResponse\022\206\001\n\037ListTableDescriptorsByNam" + - "espace\0220.hbase.pb.ListTableDescriptorsBy" + - "NamespaceRequest\0321.hbase.pb.ListTableDes", - "criptorsByNamespaceResponse\022t\n\031ListTable" + - "NamesByNamespace\022*.hbase.pb.ListTableNam" + - "esByNamespaceRequest\032+.hbase.pb.ListTabl" + - "eNamesByNamespaceResponse\022P\n\rGetTableSta" + - "te\022\036.hbase.pb.GetTableStateRequest\032\037.hba" + - "se.pb.GetTableStateResponse\022A\n\010SetQuota\022" + - "\031.hbase.pb.SetQuotaRequest\032\032.hbase.pb.Se" + - "tQuotaResponse\022x\n\037getLastMajorCompaction" + - "Timestamp\022).hbase.pb.MajorCompactionTime" + - "stampRequest\032*.hbase.pb.MajorCompactionT", - "imestampResponse\022\212\001\n(getLastMajorCompact" + - "ionTimestampForRegion\0222.hbase.pb.MajorCo" + - "mpactionTimestampForRegionRequest\032*.hbas" + - "e.pb.MajorCompactionTimestampResponse\022_\n" + - "\022getProcedureResult\022#.hbase.pb.GetProced" + - "ureResultRequest\032$.hbase.pb.GetProcedure" + - "ResultResponse\022h\n\027getSecurityCapabilitie" + - "s\022%.hbase.pb.SecurityCapabilitiesRequest" + - "\032&.hbase.pb.SecurityCapabilitiesResponse" + - "BB\n*org.apache.hadoop.hbase.protobuf.gen", - "eratedB\014MasterProtosH\001\210\001\001\240\001\001" + "Name\"U\n(MajorCompactionTimestampForRegio" + + "nRequest\022)\n\006region\030\001 \002(\0132\031.hbase.pb.Regi" + + "onSpecifier\"@\n MajorCompactionTimestampR" + + "esponse\022\034\n\024compaction_timestamp\030\001 \002(\003\"\035\n" + + "\033SecurityCapabilitiesRequest\"\354\001\n\034Securit", + "yCapabilitiesResponse\022G\n\014capabilities\030\001 " + + "\003(\01621.hbase.pb.SecurityCapabilitiesRespo" + + "nse.Capability\"\202\001\n\nCapability\022\031\n\025SIMPLE_" + + "AUTHENTICATION\020\000\022\031\n\025SECURE_AUTHENTICATIO" + + "N\020\001\022\021\n\rAUTHORIZATION\020\002\022\026\n\022CELL_AUTHORIZA" + + "TION\020\003\022\023\n\017CELL_VISIBILITY\020\0042\301#\n\rMasterSe" + + "rvice\022e\n\024GetSchemaAlterStatus\022%.hbase.pb" + + ".GetSchemaAlterStatusRequest\032&.hbase.pb." + + "GetSchemaAlterStatusResponse\022b\n\023GetTable" + + "Descriptors\022$.hbase.pb.GetTableDescripto", + "rsRequest\032%.hbase.pb.GetTableDescriptors" + + "Response\022P\n\rGetTableNames\022\036.hbase.pb.Get" + + "TableNamesRequest\032\037.hbase.pb.GetTableNam" + + "esResponse\022Y\n\020GetClusterStatus\022!.hbase.p" + + "b.GetClusterStatusRequest\032\".hbase.pb.Get" + + "ClusterStatusResponse\022V\n\017IsMasterRunning" + + "\022 .hbase.pb.IsMasterRunningRequest\032!.hba" + + "se.pb.IsMasterRunningResponse\022D\n\tAddColu" + + "mn\022\032.hbase.pb.AddColumnRequest\032\033.hbase.p" + + "b.AddColumnResponse\022M\n\014DeleteColumn\022\035.hb", + "ase.pb.DeleteColumnRequest\032\036.hbase.pb.De" + + "leteColumnResponse\022M\n\014ModifyColumn\022\035.hba" + + "se.pb.ModifyColumnRequest\032\036.hbase.pb.Mod" + + "ifyColumnResponse\022G\n\nMoveRegion\022\033.hbase." + + "pb.MoveRegionRequest\032\034.hbase.pb.MoveRegi" + + "onResponse\022k\n\026DispatchMergingRegions\022\'.h" + + "base.pb.DispatchMergingRegionsRequest\032(." + + "hbase.pb.DispatchMergingRegionsResponse\022" + + "M\n\014AssignRegion\022\035.hbase.pb.AssignRegionR" + + "equest\032\036.hbase.pb.AssignRegionResponse\022S", + "\n\016UnassignRegion\022\037.hbase.pb.UnassignRegi" + + "onRequest\032 .hbase.pb.UnassignRegionRespo" + + "nse\022P\n\rOfflineRegion\022\036.hbase.pb.OfflineR" + + "egionRequest\032\037.hbase.pb.OfflineRegionRes" + + "ponse\022J\n\013DeleteTable\022\034.hbase.pb.DeleteTa" + + "bleRequest\032\035.hbase.pb.DeleteTableRespons" + + "e\022P\n\rtruncateTable\022\036.hbase.pb.TruncateTa" + + "bleRequest\032\037.hbase.pb.TruncateTableRespo" + + "nse\022J\n\013EnableTable\022\034.hbase.pb.EnableTabl" + + "eRequest\032\035.hbase.pb.EnableTableResponse\022", + "M\n\014DisableTable\022\035.hbase.pb.DisableTableR" + + "equest\032\036.hbase.pb.DisableTableResponse\022J" + + "\n\013ModifyTable\022\034.hbase.pb.ModifyTableRequ" + + "est\032\035.hbase.pb.ModifyTableResponse\022J\n\013Cr" + + "eateTable\022\034.hbase.pb.CreateTableRequest\032" + + "\035.hbase.pb.CreateTableResponse\022A\n\010Shutdo" + + "wn\022\031.hbase.pb.ShutdownRequest\032\032.hbase.pb" + + ".ShutdownResponse\022G\n\nStopMaster\022\033.hbase." + + "pb.StopMasterRequest\032\034.hbase.pb.StopMast" + + "erResponse\022>\n\007Balance\022\030.hbase.pb.Balance", + "Request\032\031.hbase.pb.BalanceResponse\022_\n\022Se" + + "tBalancerRunning\022#.hbase.pb.SetBalancerR" + + "unningRequest\032$.hbase.pb.SetBalancerRunn" + + "ingResponse\022\\\n\021IsBalancerEnabled\022\".hbase" + + ".pb.IsBalancerEnabledRequest\032#.hbase.pb." + + "IsBalancerEnabledResponse\022S\n\016RunCatalogS" + + "can\022\037.hbase.pb.RunCatalogScanRequest\032 .h" + + "base.pb.RunCatalogScanResponse\022e\n\024Enable" + + "CatalogJanitor\022%.hbase.pb.EnableCatalogJ" + + "anitorRequest\032&.hbase.pb.EnableCatalogJa", + "nitorResponse\022n\n\027IsCatalogJanitorEnabled" + + "\022(.hbase.pb.IsCatalogJanitorEnabledReque" + + "st\032).hbase.pb.IsCatalogJanitorEnabledRes" + + "ponse\022^\n\021ExecMasterService\022#.hbase.pb.Co" + + "processorServiceRequest\032$.hbase.pb.Copro" + + "cessorServiceResponse\022A\n\010Snapshot\022\031.hbas" + + "e.pb.SnapshotRequest\032\032.hbase.pb.Snapshot" + + "Response\022h\n\025GetCompletedSnapshots\022&.hbas" + + "e.pb.GetCompletedSnapshotsRequest\032\'.hbas" + + "e.pb.GetCompletedSnapshotsResponse\022S\n\016De", + "leteSnapshot\022\037.hbase.pb.DeleteSnapshotRe" + + "quest\032 .hbase.pb.DeleteSnapshotResponse\022" + + "S\n\016IsSnapshotDone\022\037.hbase.pb.IsSnapshotD" + + "oneRequest\032 .hbase.pb.IsSnapshotDoneResp" + + "onse\022V\n\017RestoreSnapshot\022 .hbase.pb.Resto" + + "reSnapshotRequest\032!.hbase.pb.RestoreSnap" + + "shotResponse\022h\n\025IsRestoreSnapshotDone\022&." + + "hbase.pb.IsRestoreSnapshotDoneRequest\032\'." + + "hbase.pb.IsRestoreSnapshotDoneResponse\022P" + + "\n\rExecProcedure\022\036.hbase.pb.ExecProcedure", + "Request\032\037.hbase.pb.ExecProcedureResponse" + + "\022W\n\024ExecProcedureWithRet\022\036.hbase.pb.Exec" + + "ProcedureRequest\032\037.hbase.pb.ExecProcedur" + + "eResponse\022V\n\017IsProcedureDone\022 .hbase.pb." + + "IsProcedureDoneRequest\032!.hbase.pb.IsProc" + + "edureDoneResponse\022V\n\017ModifyNamespace\022 .h" + + "base.pb.ModifyNamespaceRequest\032!.hbase.p" + + "b.ModifyNamespaceResponse\022V\n\017CreateNames" + + "pace\022 .hbase.pb.CreateNamespaceRequest\032!" + + ".hbase.pb.CreateNamespaceResponse\022V\n\017Del", + "eteNamespace\022 .hbase.pb.DeleteNamespaceR" + + "equest\032!.hbase.pb.DeleteNamespaceRespons" + + "e\022k\n\026GetNamespaceDescriptor\022\'.hbase.pb.G" + + "etNamespaceDescriptorRequest\032(.hbase.pb." + + "GetNamespaceDescriptorResponse\022q\n\030ListNa" + + "mespaceDescriptors\022).hbase.pb.ListNamesp" + + "aceDescriptorsRequest\032*.hbase.pb.ListNam" + + "espaceDescriptorsResponse\022\206\001\n\037ListTableD" + + "escriptorsByNamespace\0220.hbase.pb.ListTab" + + "leDescriptorsByNamespaceRequest\0321.hbase.", + "pb.ListTableDescriptorsByNamespaceRespon" + + "se\022t\n\031ListTableNamesByNamespace\022*.hbase." + + "pb.ListTableNamesByNamespaceRequest\032+.hb" + + "ase.pb.ListTableNamesByNamespaceResponse" + + "\022P\n\rGetTableState\022\036.hbase.pb.GetTableSta" + + "teRequest\032\037.hbase.pb.GetTableStateRespon" + + "se\022A\n\010SetQuota\022\031.hbase.pb.SetQuotaReques" + + "t\032\032.hbase.pb.SetQuotaResponse\022x\n\037getLast" + + "MajorCompactionTimestamp\022).hbase.pb.Majo" + + "rCompactionTimestampRequest\032*.hbase.pb.M", + "ajorCompactionTimestampResponse\022\212\001\n(getL" + + "astMajorCompactionTimestampForRegion\0222.h" + + "base.pb.MajorCompactionTimestampForRegio" + + "nRequest\032*.hbase.pb.MajorCompactionTimes" + + "tampResponse\022_\n\022getProcedureResult\022#.hba" + + "se.pb.GetProcedureResultRequest\032$.hbase." + + "pb.GetProcedureResultResponse\022h\n\027getSecu" + + "rityCapabilities\022%.hbase.pb.SecurityCapa" + + "bilitiesRequest\032&.hbase.pb.SecurityCapab" + + "ilitiesResponseBB\n*org.apache.hadoop.hba", + "se.protobuf.generatedB\014MasterProtosH\001\210\001\001" + + "\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -56555,7 +56652,7 @@ public final class MasterProtos { internal_static_hbase_pb_BalanceRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_hbase_pb_BalanceRequest_descriptor, - new java.lang.String[] { }); + new java.lang.String[] { "Force", }); internal_static_hbase_pb_BalanceResponse_descriptor = getDescriptor().getMessageTypes().get(47); internal_static_hbase_pb_BalanceResponse_fieldAccessorTable = new diff --git a/hbase-protocol/src/main/protobuf/Master.proto b/hbase-protocol/src/main/protobuf/Master.proto index 778a02a..590fb55 100644 --- a/hbase-protocol/src/main/protobuf/Master.proto +++ b/hbase-protocol/src/main/protobuf/Master.proto @@ -243,6 +243,7 @@ message StopMasterResponse { } message BalanceRequest { + optional bool force = 1; } message BalanceResponse { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index ca721e2..a8f01a9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -1216,6 +1216,10 @@ public class HMaster extends HRegionServer implements MasterServices, Server { } public boolean balance() throws IOException { + return balance(false); + } + + public boolean balance(boolean force) throws IOException { // if master not initialized, don't run balancer. if (!this.initialized) { LOG.debug("Master has not been initialized, don't run balancer."); @@ -1230,10 +1234,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server { if (this.assignmentManager.getRegionStates().isRegionsInTransition()) { Map regionsInTransition = this.assignmentManager.getRegionStates().getRegionsInTransition(); - LOG.debug("Not running balancer because " + regionsInTransition.size() + + String prefix = force ? "R" : "Not r"; + LOG.debug(prefix + "unning balancer because " + regionsInTransition.size() + " region(s) in transition: " + org.apache.commons.lang.StringUtils. abbreviate(regionsInTransition.toString(), 256)); - return false; + if (!force) return false; } if (this.serverManager.areDeadServersInProgress()) { LOG.debug("Not running balancer because processing dead regionserver(s): " + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index beda27c..3d68463 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -407,7 +407,8 @@ public class MasterRpcServices extends RSRpcServices public BalanceResponse balance(RpcController controller, BalanceRequest request) throws ServiceException { try { - return BalanceResponse.newBuilder().setBalancerRan(master.balance()).build(); + return BalanceResponse.newBuilder().setBalancerRan(master.balance( + request.getForce())).build(); } catch (IOException ex) { throw new ServiceException(ex); } diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index 48234f3..5af194e 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -102,8 +102,8 @@ module Hbase #---------------------------------------------------------------------------------------------- # Requests a cluster balance # Returns true if balancer ran - def balancer() - @admin.balancer() + def balancer(force) + @admin.balancer(java.lang.Boolean::valueOf(force)) end #---------------------------------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/balancer.rb b/hbase-shell/src/main/ruby/shell/commands/balancer.rb index c329ece..793cfc0 100644 --- a/hbase-shell/src/main/ruby/shell/commands/balancer.rb +++ b/hbase-shell/src/main/ruby/shell/commands/balancer.rb @@ -25,13 +25,22 @@ module Shell 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). +Parameter tells master whether we should force balance even if there is region in transition. +Examples: + + hbase> balance + hbase> balance "force" EOF end - def command() + def command(force) format_simple_command do formatter.row([ - admin.balancer()? "true": "false" + if force.nil? + admin.balancer()? "true": "false" + elsif force == "force" + admin.balancer("true")? "true": "false" + end ]) end end