为什么新添加的hbase区域服务器无法获得分配给的区域?

nbnkbykc  于 2021-06-08  发布在  Hbase
关注(0)|答案(2)|浏览(673)

当我向hbase集群添加一个新的区域服务器时,没有为这个新的区域服务器分配任何区域。
新的区域服务器现在出现在web ui上,但根据web ui,其每秒的区域数和请求数都为零。
这是区域服务器日志,这是主日志。
似乎已成功添加区域服务器,但重新平衡机制不起作用。
如何在所有区域服务器上重新平衡区域?
这是我第一次在这里提问,希望有人能帮忙,谢谢。

6pp0gazn

6pp0gazn1#

我已经找到了造成这种现象的原因,一些区域在分裂过程中出现了一些问题,这些区域总是处于过渡阶段,没有完成分裂过程,这就导致了平衡器不能正常运行。
请看位于hmster.java的平衡器代码snippy:

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”语句始终为true,因此此方法始终返回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中的文件,后来我发现区域c3ebb018b9c3fc101a7b9def9100fb5f是区域32ef153360b7a9499e555a7937418ee7的子区域。
然后我检查了hdfs,我发现父区域丢失了,并且它的子区域中存在指向父存储文件的引用文件。也就是说,子区域中的引用文件指向一些不存在的文件。
因此,region server在多个区域中找到了引用文件,但找不到父区域,然后抛出了此异常。
最后,我删除了分割区域的参考文件,平衡器开始正常工作,但不知道是否有数据丢失。

yhuiod9q

yhuiod9q2#

转到hbase shell并运行命令 balancer . 这将运行平衡器一次。它返回true(成功)或false(有问题)。如果您有问题,请检查是否有区域卡在过渡中。
平衡器可以定期运行,使用 balance_switch 在hbase shell中。

相关问题