Я нашел причину этого явления. Что-то не так в процессе разделения некоторых областей, которые всегда находились в переходном состоянии и никогда не завершали процесс разделения, и это привело к тому, что балансировщик не может работать нормально.
посмотрите на фрагмент кода балансировки на HMster.java:
public boolean balance() throws IOException {
//...
if (this.assignmentManager.getRegionStates().isRegionsInTransition()) {
Map<String, RegionState> regionsInTransition =
this.assignmentManager.getRegionStates().getRegionsInTransition();
LOG.debug("Not running balancer because " + regionsInTransition.size() +
" region(s) in transition: " + org.apache.commons.lang.StringUtils.
abbreviate(regionsInTransition.toString(), 256));
return false;
}
//...
}
Оператор "if" всегда был истинным, поэтому этот метод всегда возвращал false и не выполнял код ниже, который фактически балансирует регионкластер серверов.
Я не знаю, что послужило причиной сбоя разделения некоторых регионов, но когда я попытался переместить один регион с одного сервера региона на другой, я обнаружил сообщение об ошибке на сервере региона:
2018-05-17 13:11:12,695 ERROR [B.defaultRpcServer.handler=99,queue=9,port=26020] regionserver.RSRpcServices: Failed warming up region tsdb,\x00\x12\x19Z\xD2P,1525840795373.c3ebb018b9c3fc101a7b9def9100fb5f.
java.io.IOException: java.io.IOException: java.io.FileNotFoundException: File does not exist: /hbase-holmes/data/default/tsdb/32ef153360b7a9499e555a7937418ee7/t/a6cdb25689234e539ed82230ed7b790f
at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:71)
at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:61)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsInt(FSNamesystem.java:1828)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1799)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1712)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameNodeRpcServer.java:588)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:365)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)
at org.apache.hadoop.hbase.regionserver.HRegion.initializeStores(HRegion.java:943)
at org.apache.hadoop.hbase.regionserver.HRegion.initializeWarmup(HRegion.java:967)
at org.apache.hadoop.hbase.regionserver.HRegion.warmupHRegion(HRegion.java:6554)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.warmupRegion(RSRpcServices.java:1709)
at org.apache.hadoop.hbase.protobuf.generated.AdminProtos$AdminService$2.callBlockingMethod(AdminProtos.java:22241)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2188)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:112)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
at java.lang.Thread.run(Thread.java:745)
...
Регион, который я хотел переместить, был c3ebb018b9c3fc101a7b9def9100fb5f, но из-за ошибки не удалось найти файлы в регионе 32ef153360b7a9499e555a7937418ee7, позже я обнаружил, что регион c3ebb018b9ef * 1011проверил hdfs, яобнаружил, что родительский регион отсутствует, и в его дочернем регионе, который указывает на файл хранилища родителей, отсутствует эталонный файл. То есть эталонные файлы в дочерних регионах указывают на некоторые несуществующие файлы.
Итак, регионСервер нашел эталонный файл в областях с ошибками, но не может найти родительские регионы, а затем сгенерировал это исключение.
наконец, я удалил эталонный файл тех областей разделения, и балансировщик начал работать нормально. Но я не могузнать, если какие-то данные потеряны.