Почему новый сервер региона HBase не может получить назначенные регионы?

Когда я добавил новый сервер региона в кластер HBase, никакие регионы не были назначены этому новому серверу региона.

Новый сервер региона теперь присутствует в веб-интерфейсе, но его номер. Области и количество запросов в секунду равны нулю в соответствии с веб-интерфейсом.

Это журнал сервера региона, а это главный журнал.

Кажется, сервер региона был успешно добавлен, но механизм перебалансировки не работает.

Как я могу сделать это, чтобы повторно балансировать регионы по всем серверам регионов?

Это первый раз, когда я задаю вопрос здесь, надеюсь, кто-то может помочь, большое спасибо.

2 ответа

Перейдите в оболочку HBase и выполните команду balancer, Это запустит балансировщик один раз. Возвращает истину (успех) или ложь (есть проблема). Если у вас есть проблемы, проверьте регионы, застрявшие на переходном этапе.

Балансер можно запускать периодически, используйте balance_switch в оболочке HBase.

Я нашел причину этого явления. Что-то не так в процессе разделения некоторых областей, которые всегда были в переходном периоде и никогда не заканчивали процесс разделения, и это привело к тому, что балансировщик не может работать нормально.

посмотрите на код балансировки, который можно найти на 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, позже я обнаружил, что регион c3ebb018b9c3fc101a7b9def950e5155a5a5a5a5eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.a.eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaaaaaaaaa тоже

Затем я проверил hdfs, обнаружил, что родительский регион отсутствует, и в его дочернем регионе указан справочный файл, который указывает на файл хранилища родителей. То есть, справочные файлы в дочерних регионах указали на некоторые несуществующие файлы.

Таким образом, сервер регионов нашел эталонный файл в областях с ошибками, но не может найти родительские регионы, а затем выдал это исключение.

наконец, я удалил эталонный файл разделенных областей, и балансировщик начал работать нормально. Но я не знаю, были ли потеряны некоторые данные.

Другие вопросы по тегам