Почему новый сервер региона HBase не может получить назначенные регионы? - PullRequest
0 голосов
/ 11 мая 2018

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

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

посмотрите на фрагмент кода балансировки на 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, яобнаружил, что родительский регион отсутствует, и в его дочернем регионе, который указывает на файл хранилища родителей, отсутствует эталонный файл. То есть эталонные файлы в дочерних регионах указывают на некоторые несуществующие файлы.

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

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

0 голосов
/ 13 мая 2018

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

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

...