重新启动的namenode遭受阻止报告风暴

时间:2015-08-27 13:49:00

标签: java multithreading hadoop rpc

当基于hadoop v2.4.1的备用名称节点因故障重新启动时,我们发现namenode太忙,无法在离开安全模式后及时响应。我们抛弃了几堆,所有这些都是这样的,    

Thread 212 (IPC Server handler 148 on 8020):
  State: WAITING
  Blocked count: 66
  Waited count: 598
  Waiting on java.util.concurrent.locks.ReentrantLock$FairSync@60ea5634
  Stack:
    sun.misc.Unsafe.park(Native Method)
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
    java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:229)
    java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
    org.apache.hadoop.hdfs.server.namenode.FSNamesystem.writeLock(FSNamesystem.java:1378)
    org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.processReport(BlockManager.java:1676)
    org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.blockReport(NameNodeRpcServer.java:1019)
    org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolServerSideTranslatorPB.blockReport(DatanodeProtocolServerSideTranslatorPB.java:152)
    org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos$DatanodeProtocolService$2.callBlockingMethod(DatanodeProtocolProtos.java:28061)
    org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585)
    org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928)
    org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013)
    org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009)
    java.security.AccessController.doPrivileged(Native Method)
    javax.security.auth.Subject.doAs(Subject.java:415)
    org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
    org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007)
   

几乎所有服务器处理程序都在等待FSNameSystem#writeLock处理增量/完整报告!

CONF:

  

dfs.blockreport.initialDelay:120。
      dfs.blockreport.intervalMsec:6h。
     服务器处理程序编号:200。
      datanodes number:400。
      namenode需要0.5~1秒来处理块报告。

datanode的日志会看到很多offerService IOExceptions和retries。

NN日志表明数据节点的存储已经处理了两次以上,有些甚至达到了10次。

blockLog.info("BLOCK* processReport: from storage " + storage.getStorageID() + " node " + nodeID + ", blocks: " + newReport.getNumberOfBlocks() + ", processing time: " + (endTime - startTime) + " msecs");

有没有人见过同样的问题,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最后,我们根据服务器的功能减少服务器的IPC处理程序的数量,并解决问题。希望这会帮助那些陷入同样麻烦的人!