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 30181ce..8ea3e80 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 @@ -704,6 +704,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 57a171c..5416386 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 @@ -2220,7 +2220,17 @@ 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(); + } + }); + } + + @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 e9e54ba..0566573 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 @@ -1388,8 +1388,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 f1420b0..140ca71 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 @@ -24836,6 +24836,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} @@ -24870,6 +24880,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 { @@ -24887,6 +24898,11 @@ public final class MasterProtos { } break; } + case 8: { + bitField0_ |= 0x00000001; + force_ = input.readBool(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -24926,7 +24942,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() { @@ -24940,6 +24974,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); } @@ -24949,6 +24986,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; @@ -24972,6 +25013,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; @@ -24985,6 +25031,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; @@ -25094,6 +25144,8 @@ public final class MasterProtos { public Builder clear() { super.clear(); + force_ = false; + bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -25120,6 +25172,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; } @@ -25135,6 +25194,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; } @@ -25160,6 +25222,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) } @@ -54662,203 +54758,203 @@ public final class MasterProtos { "paceResponse\022&\n\ttableName\030\001 \003(\0132\023.hbase." + "pb.TableName\"\021\n\017ShutdownRequest\"\022\n\020Shutd" + "ownResponse\"\023\n\021StopMasterRequest\"\024\n\022Stop" + - "MasterResponse\"\020\n\016BalanceRequest\"\'\n\017Bala" + - "nceResponse\022\024\n\014balancer_ran\030\001 \002(\010\"<\n\031Set", - "BalancerRunningRequest\022\n\n\002on\030\001 \002(\010\022\023\n\013sy" + - "nchronous\030\002 \001(\010\"8\n\032SetBalancerRunningRes" + - "ponse\022\032\n\022prev_balance_value\030\001 \001(\010\"\032\n\030IsB" + - "alancerEnabledRequest\",\n\031IsBalancerEnabl" + - "edResponse\022\017\n\007enabled\030\001 \002(\010\"\027\n\025RunCatalo" + - "gScanRequest\"-\n\026RunCatalogScanResponse\022\023" + - "\n\013scan_result\030\001 \001(\005\"-\n\033EnableCatalogJani" + - "torRequest\022\016\n\006enable\030\001 \002(\010\"2\n\034EnableCata" + - "logJanitorResponse\022\022\n\nprev_value\030\001 \001(\010\" " + - "\n\036IsCatalogJanitorEnabledRequest\"0\n\037IsCa", - "talogJanitorEnabledResponse\022\r\n\005value\030\001 \002" + - "(\010\"B\n\017SnapshotRequest\022/\n\010snapshot\030\001 \002(\0132" + - "\035.hbase.pb.SnapshotDescription\",\n\020Snapsh" + - "otResponse\022\030\n\020expected_timeout\030\001 \002(\003\"\036\n\034" + - "GetCompletedSnapshotsRequest\"Q\n\035GetCompl" + - "etedSnapshotsResponse\0220\n\tsnapshots\030\001 \003(\013" + - "2\035.hbase.pb.SnapshotDescription\"H\n\025Delet" + - "eSnapshotRequest\022/\n\010snapshot\030\001 \002(\0132\035.hba" + - "se.pb.SnapshotDescription\"\030\n\026DeleteSnaps" + - "hotResponse\"I\n\026RestoreSnapshotRequest\022/\n", - "\010snapshot\030\001 \002(\0132\035.hbase.pb.SnapshotDescr" + - "iption\"\031\n\027RestoreSnapshotResponse\"H\n\025IsS" + - "napshotDoneRequest\022/\n\010snapshot\030\001 \001(\0132\035.h" + - "base.pb.SnapshotDescription\"^\n\026IsSnapsho" + - "tDoneResponse\022\023\n\004done\030\001 \001(\010:\005false\022/\n\010sn" + - "apshot\030\002 \001(\0132\035.hbase.pb.SnapshotDescript" + - "ion\"O\n\034IsRestoreSnapshotDoneRequest\022/\n\010s" + - "napshot\030\001 \001(\0132\035.hbase.pb.SnapshotDescrip" + - "tion\"4\n\035IsRestoreSnapshotDoneResponse\022\023\n" + - "\004done\030\001 \001(\010:\005false\"F\n\033GetSchemaAlterStat", - "usRequest\022\'\n\ntable_name\030\001 \002(\0132\023.hbase.pb" + - ".TableName\"T\n\034GetSchemaAlterStatusRespon" + - "se\022\035\n\025yet_to_update_regions\030\001 \001(\r\022\025\n\rtot" + - "al_regions\030\002 \001(\r\"\213\001\n\032GetTableDescriptors" + - "Request\022(\n\013table_names\030\001 \003(\0132\023.hbase.pb." + - "TableName\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\033GetTableDescriptorsResponse\022+\n\014table_s" + - "chema\030\001 \003(\0132\025.hbase.pb.TableSchema\"[\n\024Ge" + - "tTableNamesRequest\022\r\n\005regex\030\001 \001(\t\022!\n\022inc", - "lude_sys_tables\030\002 \001(\010:\005false\022\021\n\tnamespac" + - "e\030\003 \001(\t\"A\n\025GetTableNamesResponse\022(\n\013tabl" + - "e_names\030\001 \003(\0132\023.hbase.pb.TableName\"\031\n\027Ge" + - "tClusterStatusRequest\"K\n\030GetClusterStatu" + - "sResponse\022/\n\016cluster_status\030\001 \002(\0132\027.hbas" + - "e.pb.ClusterStatus\"\030\n\026IsMasterRunningReq" + - "uest\"4\n\027IsMasterRunningResponse\022\031\n\021is_ma" + - "ster_running\030\001 \002(\010\"I\n\024ExecProcedureReque" + - "st\0221\n\tprocedure\030\001 \002(\0132\036.hbase.pb.Procedu" + - "reDescription\"F\n\025ExecProcedureResponse\022\030", - "\n\020expected_timeout\030\001 \001(\003\022\023\n\013return_data\030" + - "\002 \001(\014\"K\n\026IsProcedureDoneRequest\0221\n\tproce" + - "dure\030\001 \001(\0132\036.hbase.pb.ProcedureDescripti" + - "on\"`\n\027IsProcedureDoneResponse\022\023\n\004done\030\001 " + - "\001(\010:\005false\0220\n\010snapshot\030\002 \001(\0132\036.hbase.pb." + - "ProcedureDescription\",\n\031GetProcedureResu" + - "ltRequest\022\017\n\007proc_id\030\001 \002(\004\"\371\001\n\032GetProced" + - "ureResultResponse\0229\n\005state\030\001 \002(\0162*.hbase" + - ".pb.GetProcedureResultResponse.State\022\022\n\n" + - "start_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\005State\022\r\n\t" + - "NOT_FOUND\020\000\022\013\n\007RUNNING\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\n" + - "table_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.ThrottleR" + - "equest\"\022\n\020SetQuotaResponse\"J\n\037MajorCompa" + - "ctionTimestampRequest\022\'\n\ntable_name\030\001 \002(", - "\0132\023.hbase.pb.TableName\"U\n(MajorCompactio" + - "nTimestampForRegionRequest\022)\n\006region\030\001 \002" + - "(\0132\031.hbase.pb.RegionSpecifier\"@\n MajorCo" + - "mpactionTimestampResponse\022\034\n\024compaction_" + - "timestamp\030\001 \002(\003\"\035\n\033SecurityCapabilitiesR" + - "equest\"\354\001\n\034SecurityCapabilitiesResponse\022" + - "G\n\014capabilities\030\001 \003(\01621.hbase.pb.Securit" + - "yCapabilitiesResponse.Capability\"\202\001\n\nCap" + - "ability\022\031\n\025SIMPLE_AUTHENTICATION\020\000\022\031\n\025SE" + - "CURE_AUTHENTICATION\020\001\022\021\n\rAUTHORIZATION\020\002", - "\022\026\n\022CELL_AUTHORIZATION\020\003\022\023\n\017CELL_VISIBIL" + - "ITY\020\0042\357\"\n\rMasterService\022e\n\024GetSchemaAlte" + - "rStatus\022%.hbase.pb.GetSchemaAlterStatusR" + - "equest\032&.hbase.pb.GetSchemaAlterStatusRe" + - "sponse\022b\n\023GetTableDescriptors\022$.hbase.pb" + - ".GetTableDescriptorsRequest\032%.hbase.pb.G" + - "etTableDescriptorsResponse\022P\n\rGetTableNa" + - "mes\022\036.hbase.pb.GetTableNamesRequest\032\037.hb" + - "ase.pb.GetTableNamesResponse\022Y\n\020GetClust" + - "erStatus\022!.hbase.pb.GetClusterStatusRequ", - "est\032\".hbase.pb.GetClusterStatusResponse\022" + - "V\n\017IsMasterRunning\022 .hbase.pb.IsMasterRu" + - "nningRequest\032!.hbase.pb.IsMasterRunningR" + - "esponse\022D\n\tAddColumn\022\032.hbase.pb.AddColum" + - "nRequest\032\033.hbase.pb.AddColumnResponse\022M\n" + - "\014DeleteColumn\022\035.hbase.pb.DeleteColumnReq" + - "uest\032\036.hbase.pb.DeleteColumnResponse\022M\n\014" + - "ModifyColumn\022\035.hbase.pb.ModifyColumnRequ" + - "est\032\036.hbase.pb.ModifyColumnResponse\022G\n\nM" + - "oveRegion\022\033.hbase.pb.MoveRegionRequest\032\034", - ".hbase.pb.MoveRegionResponse\022k\n\026Dispatch" + - "MergingRegions\022\'.hbase.pb.DispatchMergin" + - "gRegionsRequest\032(.hbase.pb.DispatchMergi" + - "ngRegionsResponse\022M\n\014AssignRegion\022\035.hbas" + - "e.pb.AssignRegionRequest\032\036.hbase.pb.Assi" + - "gnRegionResponse\022S\n\016UnassignRegion\022\037.hba" + - "se.pb.UnassignRegionRequest\032 .hbase.pb.U" + - "nassignRegionResponse\022P\n\rOfflineRegion\022\036" + - ".hbase.pb.OfflineRegionRequest\032\037.hbase.p" + - "b.OfflineRegionResponse\022J\n\013DeleteTable\022\034", - ".hbase.pb.DeleteTableRequest\032\035.hbase.pb." + - "DeleteTableResponse\022P\n\rtruncateTable\022\036.h" + - "base.pb.TruncateTableRequest\032\037.hbase.pb." + - "TruncateTableResponse\022J\n\013EnableTable\022\034.h" + - "base.pb.EnableTableRequest\032\035.hbase.pb.En" + - "ableTableResponse\022M\n\014DisableTable\022\035.hbas" + - "e.pb.DisableTableRequest\032\036.hbase.pb.Disa" + - "bleTableResponse\022J\n\013ModifyTable\022\034.hbase." + - "pb.ModifyTableRequest\032\035.hbase.pb.ModifyT" + - "ableResponse\022J\n\013CreateTable\022\034.hbase.pb.C", - "reateTableRequest\032\035.hbase.pb.CreateTable" + - "Response\022A\n\010Shutdown\022\031.hbase.pb.Shutdown" + - "Request\032\032.hbase.pb.ShutdownResponse\022G\n\nS" + - "topMaster\022\033.hbase.pb.StopMasterRequest\032\034" + - ".hbase.pb.StopMasterResponse\022>\n\007Balance\022" + - "\030.hbase.pb.BalanceRequest\032\031.hbase.pb.Bal" + - "anceResponse\022_\n\022SetBalancerRunning\022#.hba" + - "se.pb.SetBalancerRunningRequest\032$.hbase." + - "pb.SetBalancerRunningResponse\022\\\n\021IsBalan" + - "cerEnabled\022\".hbase.pb.IsBalancerEnabledR", - "equest\032#.hbase.pb.IsBalancerEnabledRespo" + - "nse\022S\n\016RunCatalogScan\022\037.hbase.pb.RunCata" + - "logScanRequest\032 .hbase.pb.RunCatalogScan" + - "Response\022e\n\024EnableCatalogJanitor\022%.hbase" + - ".pb.EnableCatalogJanitorRequest\032&.hbase." + - "pb.EnableCatalogJanitorResponse\022n\n\027IsCat" + - "alogJanitorEnabled\022(.hbase.pb.IsCatalogJ" + - "anitorEnabledRequest\032).hbase.pb.IsCatalo" + - "gJanitorEnabledResponse\022^\n\021ExecMasterSer" + - "vice\022#.hbase.pb.CoprocessorServiceReques", - "t\032$.hbase.pb.CoprocessorServiceResponse\022" + - "A\n\010Snapshot\022\031.hbase.pb.SnapshotRequest\032\032" + - ".hbase.pb.SnapshotResponse\022h\n\025GetComplet" + - "edSnapshots\022&.hbase.pb.GetCompletedSnaps" + - "hotsRequest\032\'.hbase.pb.GetCompletedSnaps" + - "hotsResponse\022S\n\016DeleteSnapshot\022\037.hbase.p" + - "b.DeleteSnapshotRequest\032 .hbase.pb.Delet" + - "eSnapshotResponse\022S\n\016IsSnapshotDone\022\037.hb" + - "ase.pb.IsSnapshotDoneRequest\032 .hbase.pb." + - "IsSnapshotDoneResponse\022V\n\017RestoreSnapsho", - "t\022 .hbase.pb.RestoreSnapshotRequest\032!.hb" + - "ase.pb.RestoreSnapshotResponse\022h\n\025IsRest" + - "oreSnapshotDone\022&.hbase.pb.IsRestoreSnap" + - "shotDoneRequest\032\'.hbase.pb.IsRestoreSnap" + - "shotDoneResponse\022P\n\rExecProcedure\022\036.hbas" + - "e.pb.ExecProcedureRequest\032\037.hbase.pb.Exe" + - "cProcedureResponse\022W\n\024ExecProcedureWithR" + - "et\022\036.hbase.pb.ExecProcedureRequest\032\037.hba" + - "se.pb.ExecProcedureResponse\022V\n\017IsProcedu" + - "reDone\022 .hbase.pb.IsProcedureDoneRequest", - "\032!.hbase.pb.IsProcedureDoneResponse\022V\n\017M" + - "odifyNamespace\022 .hbase.pb.ModifyNamespac" + - "eRequest\032!.hbase.pb.ModifyNamespaceRespo" + - "nse\022V\n\017CreateNamespace\022 .hbase.pb.Create" + - "NamespaceRequest\032!.hbase.pb.CreateNamesp" + - "aceResponse\022V\n\017DeleteNamespace\022 .hbase.p" + - "b.DeleteNamespaceRequest\032!.hbase.pb.Dele" + - "teNamespaceResponse\022k\n\026GetNamespaceDescr" + - "iptor\022\'.hbase.pb.GetNamespaceDescriptorR" + - "equest\032(.hbase.pb.GetNamespaceDescriptor", - "Response\022q\n\030ListNamespaceDescriptors\022).h" + - "base.pb.ListNamespaceDescriptorsRequest\032" + - "*.hbase.pb.ListNamespaceDescriptorsRespo" + - "nse\022\206\001\n\037ListTableDescriptorsByNamespace\022" + - "0.hbase.pb.ListTableDescriptorsByNamespa" + - "ceRequest\0321.hbase.pb.ListTableDescriptor" + - "sByNamespaceResponse\022t\n\031ListTableNamesBy" + - "Namespace\022*.hbase.pb.ListTableNamesByNam" + - "espaceRequest\032+.hbase.pb.ListTableNamesB" + - "yNamespaceResponse\022A\n\010SetQuota\022\031.hbase.p", - "b.SetQuotaRequest\032\032.hbase.pb.SetQuotaRes" + - "ponse\022x\n\037getLastMajorCompactionTimestamp" + - "\022).hbase.pb.MajorCompactionTimestampRequ" + - "est\032*.hbase.pb.MajorCompactionTimestampR" + - "esponse\022\212\001\n(getLastMajorCompactionTimest" + - "ampForRegion\0222.hbase.pb.MajorCompactionT" + - "imestampForRegionRequest\032*.hbase.pb.Majo" + - "rCompactionTimestampResponse\022_\n\022getProce" + - "dureResult\022#.hbase.pb.GetProcedureResult" + - "Request\032$.hbase.pb.GetProcedureResultRes", - "ponse\022h\n\027getSecurityCapabilities\022%.hbase" + - ".pb.SecurityCapabilitiesRequest\032&.hbase." + - "pb.SecurityCapabilitiesResponseBB\n*org.a" + - "pache.hadoop.hbase.protobuf.generatedB\014M" + - "asterProtosH\001\210\001\001\240\001\001" + "MasterResponse\"\037\n\016BalanceRequest\022\r\n\005forc" + + "e\030\001 \001(\010\"\'\n\017BalanceResponse\022\024\n\014balancer_r", + "an\030\001 \002(\010\"<\n\031SetBalancerRunningRequest\022\n\n" + + "\002on\030\001 \002(\010\022\023\n\013synchronous\030\002 \001(\010\"8\n\032SetBal" + + "ancerRunningResponse\022\032\n\022prev_balance_val" + + "ue\030\001 \001(\010\"\032\n\030IsBalancerEnabledRequest\",\n\031" + + "IsBalancerEnabledResponse\022\017\n\007enabled\030\001 \002" + + "(\010\"\027\n\025RunCatalogScanRequest\"-\n\026RunCatalo" + + "gScanResponse\022\023\n\013scan_result\030\001 \001(\005\"-\n\033En" + + "ableCatalogJanitorRequest\022\016\n\006enable\030\001 \002(" + + "\010\"2\n\034EnableCatalogJanitorResponse\022\022\n\npre" + + "v_value\030\001 \001(\010\" \n\036IsCatalogJanitorEnabled", + "Request\"0\n\037IsCatalogJanitorEnabledRespon" + + "se\022\r\n\005value\030\001 \002(\010\"B\n\017SnapshotRequest\022/\n\010" + + "snapshot\030\001 \002(\0132\035.hbase.pb.SnapshotDescri" + + "ption\",\n\020SnapshotResponse\022\030\n\020expected_ti" + + "meout\030\001 \002(\003\"\036\n\034GetCompletedSnapshotsRequ" + + "est\"Q\n\035GetCompletedSnapshotsResponse\0220\n\t" + + "snapshots\030\001 \003(\0132\035.hbase.pb.SnapshotDescr" + + "iption\"H\n\025DeleteSnapshotRequest\022/\n\010snaps" + + "hot\030\001 \002(\0132\035.hbase.pb.SnapshotDescription" + + "\"\030\n\026DeleteSnapshotResponse\"I\n\026RestoreSna", + "pshotRequest\022/\n\010snapshot\030\001 \002(\0132\035.hbase.p" + + "b.SnapshotDescription\"\031\n\027RestoreSnapshot" + + "Response\"H\n\025IsSnapshotDoneRequest\022/\n\010sna" + + "pshot\030\001 \001(\0132\035.hbase.pb.SnapshotDescripti" + + "on\"^\n\026IsSnapshotDoneResponse\022\023\n\004done\030\001 \001" + + "(\010:\005false\022/\n\010snapshot\030\002 \001(\0132\035.hbase.pb.S" + + "napshotDescription\"O\n\034IsRestoreSnapshotD" + + "oneRequest\022/\n\010snapshot\030\001 \001(\0132\035.hbase.pb." + + "SnapshotDescription\"4\n\035IsRestoreSnapshot" + + "DoneResponse\022\023\n\004done\030\001 \001(\010:\005false\"F\n\033Get", + "SchemaAlterStatusRequest\022\'\n\ntable_name\030\001" + + " \002(\0132\023.hbase.pb.TableName\"T\n\034GetSchemaAl" + + "terStatusResponse\022\035\n\025yet_to_update_regio" + + "ns\030\001 \001(\r\022\025\n\rtotal_regions\030\002 \001(\r\"\213\001\n\032GetT" + + "ableDescriptorsRequest\022(\n\013table_names\030\001 " + + "\003(\0132\023.hbase.pb.TableName\022\r\n\005regex\030\002 \001(\t\022" + + "!\n\022include_sys_tables\030\003 \001(\010:\005false\022\021\n\tna" + + "mespace\030\004 \001(\t\"J\n\033GetTableDescriptorsResp" + + "onse\022+\n\014table_schema\030\001 \003(\0132\025.hbase.pb.Ta" + + "bleSchema\"[\n\024GetTableNamesRequest\022\r\n\005reg", + "ex\030\001 \001(\t\022!\n\022include_sys_tables\030\002 \001(\010:\005fa" + + "lse\022\021\n\tnamespace\030\003 \001(\t\"A\n\025GetTableNamesR" + + "esponse\022(\n\013table_names\030\001 \003(\0132\023.hbase.pb." + + "TableName\"\031\n\027GetClusterStatusRequest\"K\n\030" + + "GetClusterStatusResponse\022/\n\016cluster_stat" + + "us\030\001 \002(\0132\027.hbase.pb.ClusterStatus\"\030\n\026IsM" + + "asterRunningRequest\"4\n\027IsMasterRunningRe" + + "sponse\022\031\n\021is_master_running\030\001 \002(\010\"I\n\024Exe" + + "cProcedureRequest\0221\n\tprocedure\030\001 \002(\0132\036.h" + + "base.pb.ProcedureDescription\"F\n\025ExecProc", + "edureResponse\022\030\n\020expected_timeout\030\001 \001(\003\022" + + "\023\n\013return_data\030\002 \001(\014\"K\n\026IsProcedureDoneR" + + "equest\0221\n\tprocedure\030\001 \001(\0132\036.hbase.pb.Pro" + + "cedureDescription\"`\n\027IsProcedureDoneResp" + + "onse\022\023\n\004done\030\001 \001(\010:\005false\0220\n\010snapshot\030\002 " + + "\001(\0132\036.hbase.pb.ProcedureDescription\",\n\031G" + + "etProcedureResultRequest\022\017\n\007proc_id\030\001 \002(" + + "\004\"\371\001\n\032GetProcedureResultResponse\0229\n\005stat" + + "e\030\001 \002(\0162*.hbase.pb.GetProcedureResultRes" + + "ponse.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\texceptio" + + "n\030\005 \001(\0132!.hbase.pb.ForeignExceptionMessa" + + "ge\"1\n\005State\022\r\n\tNOT_FOUND\020\000\022\013\n\007RUNNING\020\001\022" + + "\014\n\010FINISHED\020\002\"\315\001\n\017SetQuotaRequest\022\021\n\tuse" + + "r_name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t\022\021\n\tname" + + "space\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\016bypa" + + "ss_globals\030\006 \001(\010\022+\n\010throttle\030\007 \001(\0132\031.hba" + + "se.pb.ThrottleRequest\"\022\n\020SetQuotaRespons" + + "e\"J\n\037MajorCompactionTimestampRequest\022\'\n\n", + "table_name\030\001 \002(\0132\023.hbase.pb.TableName\"U\n" + + "(MajorCompactionTimestampForRegionReques" + + "t\022)\n\006region\030\001 \002(\0132\031.hbase.pb.RegionSpeci" + + "fier\"@\n MajorCompactionTimestampResponse" + + "\022\034\n\024compaction_timestamp\030\001 \002(\003\"\035\n\033Securi" + + "tyCapabilitiesRequest\"\354\001\n\034SecurityCapabi" + + "litiesResponse\022G\n\014capabilities\030\001 \003(\01621.h" + + "base.pb.SecurityCapabilitiesResponse.Cap" + + "ability\"\202\001\n\nCapability\022\031\n\025SIMPLE_AUTHENT" + + "ICATION\020\000\022\031\n\025SECURE_AUTHENTICATION\020\001\022\021\n\r", + "AUTHORIZATION\020\002\022\026\n\022CELL_AUTHORIZATION\020\003\022" + + "\023\n\017CELL_VISIBILITY\020\0042\357\"\n\rMasterService\022e" + + "\n\024GetSchemaAlterStatus\022%.hbase.pb.GetSch" + + "emaAlterStatusRequest\032&.hbase.pb.GetSche" + + "maAlterStatusResponse\022b\n\023GetTableDescrip" + + "tors\022$.hbase.pb.GetTableDescriptorsReque" + + "st\032%.hbase.pb.GetTableDescriptorsRespons" + + "e\022P\n\rGetTableNames\022\036.hbase.pb.GetTableNa" + + "mesRequest\032\037.hbase.pb.GetTableNamesRespo" + + "nse\022Y\n\020GetClusterStatus\022!.hbase.pb.GetCl", + "usterStatusRequest\032\".hbase.pb.GetCluster" + + "StatusResponse\022V\n\017IsMasterRunning\022 .hbas" + + "e.pb.IsMasterRunningRequest\032!.hbase.pb.I" + + "sMasterRunningResponse\022D\n\tAddColumn\022\032.hb" + + "ase.pb.AddColumnRequest\032\033.hbase.pb.AddCo" + + "lumnResponse\022M\n\014DeleteColumn\022\035.hbase.pb." + + "DeleteColumnRequest\032\036.hbase.pb.DeleteCol" + + "umnResponse\022M\n\014ModifyColumn\022\035.hbase.pb.M" + + "odifyColumnRequest\032\036.hbase.pb.ModifyColu" + + "mnResponse\022G\n\nMoveRegion\022\033.hbase.pb.Move", + "RegionRequest\032\034.hbase.pb.MoveRegionRespo" + + "nse\022k\n\026DispatchMergingRegions\022\'.hbase.pb" + + ".DispatchMergingRegionsRequest\032(.hbase.p" + + "b.DispatchMergingRegionsResponse\022M\n\014Assi" + + "gnRegion\022\035.hbase.pb.AssignRegionRequest\032" + + "\036.hbase.pb.AssignRegionResponse\022S\n\016Unass" + + "ignRegion\022\037.hbase.pb.UnassignRegionReque" + + "st\032 .hbase.pb.UnassignRegionResponse\022P\n\r" + + "OfflineRegion\022\036.hbase.pb.OfflineRegionRe" + + "quest\032\037.hbase.pb.OfflineRegionResponse\022J", + "\n\013DeleteTable\022\034.hbase.pb.DeleteTableRequ" + + "est\032\035.hbase.pb.DeleteTableResponse\022P\n\rtr" + + "uncateTable\022\036.hbase.pb.TruncateTableRequ" + + "est\032\037.hbase.pb.TruncateTableResponse\022J\n\013" + + "EnableTable\022\034.hbase.pb.EnableTableReques" + + "t\032\035.hbase.pb.EnableTableResponse\022M\n\014Disa" + + "bleTable\022\035.hbase.pb.DisableTableRequest\032" + + "\036.hbase.pb.DisableTableResponse\022J\n\013Modif" + + "yTable\022\034.hbase.pb.ModifyTableRequest\032\035.h" + + "base.pb.ModifyTableResponse\022J\n\013CreateTab", + "le\022\034.hbase.pb.CreateTableRequest\032\035.hbase" + + ".pb.CreateTableResponse\022A\n\010Shutdown\022\031.hb" + + "ase.pb.ShutdownRequest\032\032.hbase.pb.Shutdo" + + "wnResponse\022G\n\nStopMaster\022\033.hbase.pb.Stop" + + "MasterRequest\032\034.hbase.pb.StopMasterRespo" + + "nse\022>\n\007Balance\022\030.hbase.pb.BalanceRequest" + + "\032\031.hbase.pb.BalanceResponse\022_\n\022SetBalanc" + + "erRunning\022#.hbase.pb.SetBalancerRunningR" + + "equest\032$.hbase.pb.SetBalancerRunningResp" + + "onse\022\\\n\021IsBalancerEnabled\022\".hbase.pb.IsB", + "alancerEnabledRequest\032#.hbase.pb.IsBalan" + + "cerEnabledResponse\022S\n\016RunCatalogScan\022\037.h" + + "base.pb.RunCatalogScanRequest\032 .hbase.pb" + + ".RunCatalogScanResponse\022e\n\024EnableCatalog" + + "Janitor\022%.hbase.pb.EnableCatalogJanitorR" + + "equest\032&.hbase.pb.EnableCatalogJanitorRe" + + "sponse\022n\n\027IsCatalogJanitorEnabled\022(.hbas" + + "e.pb.IsCatalogJanitorEnabledRequest\032).hb" + + "ase.pb.IsCatalogJanitorEnabledResponse\022^" + + "\n\021ExecMasterService\022#.hbase.pb.Coprocess", + "orServiceRequest\032$.hbase.pb.CoprocessorS" + + "erviceResponse\022A\n\010Snapshot\022\031.hbase.pb.Sn" + + "apshotRequest\032\032.hbase.pb.SnapshotRespons" + + "e\022h\n\025GetCompletedSnapshots\022&.hbase.pb.Ge" + + "tCompletedSnapshotsRequest\032\'.hbase.pb.Ge" + + "tCompletedSnapshotsResponse\022S\n\016DeleteSna" + + "pshot\022\037.hbase.pb.DeleteSnapshotRequest\032 " + + ".hbase.pb.DeleteSnapshotResponse\022S\n\016IsSn" + + "apshotDone\022\037.hbase.pb.IsSnapshotDoneRequ" + + "est\032 .hbase.pb.IsSnapshotDoneResponse\022V\n", + "\017RestoreSnapshot\022 .hbase.pb.RestoreSnaps" + + "hotRequest\032!.hbase.pb.RestoreSnapshotRes" + + "ponse\022h\n\025IsRestoreSnapshotDone\022&.hbase.p" + + "b.IsRestoreSnapshotDoneRequest\032\'.hbase.p" + + "b.IsRestoreSnapshotDoneResponse\022P\n\rExecP" + + "rocedure\022\036.hbase.pb.ExecProcedureRequest" + + "\032\037.hbase.pb.ExecProcedureResponse\022W\n\024Exe" + + "cProcedureWithRet\022\036.hbase.pb.ExecProcedu" + + "reRequest\032\037.hbase.pb.ExecProcedureRespon" + + "se\022V\n\017IsProcedureDone\022 .hbase.pb.IsProce", + "dureDoneRequest\032!.hbase.pb.IsProcedureDo" + + "neResponse\022V\n\017ModifyNamespace\022 .hbase.pb" + + ".ModifyNamespaceRequest\032!.hbase.pb.Modif" + + "yNamespaceResponse\022V\n\017CreateNamespace\022 ." + + "hbase.pb.CreateNamespaceRequest\032!.hbase." + + "pb.CreateNamespaceResponse\022V\n\017DeleteName" + + "space\022 .hbase.pb.DeleteNamespaceRequest\032" + + "!.hbase.pb.DeleteNamespaceResponse\022k\n\026Ge" + + "tNamespaceDescriptor\022\'.hbase.pb.GetNames" + + "paceDescriptorRequest\032(.hbase.pb.GetName", + "spaceDescriptorResponse\022q\n\030ListNamespace" + + "Descriptors\022).hbase.pb.ListNamespaceDesc" + + "riptorsRequest\032*.hbase.pb.ListNamespaceD" + + "escriptorsResponse\022\206\001\n\037ListTableDescript" + + "orsByNamespace\0220.hbase.pb.ListTableDescr" + + "iptorsByNamespaceRequest\0321.hbase.pb.List" + + "TableDescriptorsByNamespaceResponse\022t\n\031L" + + "istTableNamesByNamespace\022*.hbase.pb.List" + + "TableNamesByNamespaceRequest\032+.hbase.pb." + + "ListTableNamesByNamespaceResponse\022A\n\010Set", + "Quota\022\031.hbase.pb.SetQuotaRequest\032\032.hbase" + + ".pb.SetQuotaResponse\022x\n\037getLastMajorComp" + + "actionTimestamp\022).hbase.pb.MajorCompacti" + + "onTimestampRequest\032*.hbase.pb.MajorCompa" + + "ctionTimestampResponse\022\212\001\n(getLastMajorC" + + "ompactionTimestampForRegion\0222.hbase.pb.M" + + "ajorCompactionTimestampForRegionRequest\032" + + "*.hbase.pb.MajorCompactionTimestampRespo" + + "nse\022_\n\022getProcedureResult\022#.hbase.pb.Get" + + "ProcedureResultRequest\032$.hbase.pb.GetPro", + "cedureResultResponse\022h\n\027getSecurityCapab" + + "ilities\022%.hbase.pb.SecurityCapabilitiesR" + + "equest\032&.hbase.pb.SecurityCapabilitiesRe" + + "sponseBB\n*org.apache.hadoop.hbase.protob" + + "uf.generatedB\014MasterProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -55146,7 +55242,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 86cd655..420448b 100644 --- a/hbase-protocol/src/main/protobuf/Master.proto +++ b/hbase-protocol/src/main/protobuf/Master.proto @@ -241,6 +241,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 b57b993..4d82866 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 @@ -1213,6 +1213,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."); @@ -1227,10 +1231,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 d7bbc91..146d7a2 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 @@ -400,7 +400,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.hasForce() ? request.getForce() : false)).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 0014df7..a1445ae 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..0ed262c 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> balancer + hbase> balancer "force" EOF end - def command() + def command(force=nil) format_simple_command do formatter.row([ - admin.balancer()? "true": "false" + if force.nil? + admin.balancer("false")? "true": "false" + elsif force == "force" + admin.balancer("true")? "true": "false" + end ]) end end