HDFS:当一些数据节点空间不足,但仍有足够空间的节点时,纱线导出会导致死亡



我们有两个Hadoop集群。我们想要将Hbase快照从一个集群导出到另一个集群。目标集群由3个128TB数据节点和5个28TB数据节点组成。一切顺利,直到5个最小的数据节点达到占用限制。这时,在另一个集群中启动的yarn任务开始抱怨,并显示以下消息:

Error: org.apache.hadoop.ipc.RemoteException(java.io.IOException):
File /hbase/archive/data/default/HBASE/57e8bf457599cd0dbee2fb0fc407f312/D/bdc14899028f48a2ba8a747e00554304
could only be written to 0 of the 1 minReplication nodes. There are 8 datanode(s) running and 8 node(s) are excluded in this operation. 
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2278)
at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:294)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2808)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:905)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:577)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:528)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1086) 
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1029) 
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:957) 
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:1762)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2957) 
at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1498) 
at org.apache.hadoop.ipc.Client.call(Client.java:1444) 
at org.apache.hadoop.ipc.Client.call(Client.java:1354) 
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
at com.sun.proxy.$Proxy13.addBlock(Unknown Source) 
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:510)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:422)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeMethod(RetryInvocationHandler.java:165)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invoke(RetryInvocationHandler.java:157)
at org.apache.hadoop.io.retry.RetryInvocationHandler$Call.invokeOnce(RetryInvocationHandler.java:95)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:359)
at com.sun.proxy.$Proxy14.addBlock(Unknown Source) 
at org.apache.hadoop.hdfs.DFSOutputStream.addBlock(DFSOutputStream.java:1078)
at org.apache.hadoop.hdfs.DataStreamer.locateFollowingBlock(DataStreamer.java:1865)
at org.apache.hadoop.hdfs.DataStreamer.nextBlockOutputStream(DataStreamer.java:1668)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:716)

最后,纱线任务最终扼杀了出口。是否有一个参数告诉集群继续写入具有足够空间的集群的其余部分?事先非常感谢。

您可以编写一个BlockPlacementPolicy。。

你可以稍微调整一下你的支架设置,试着提高你的胜算。我想不出一个现成的策略,但我相信有更好和更糟糕的策略。

让我们重新定义问题:

为什么不在操作过程中简单地关闭5个小数据节点呢?

为什么不将您正在创建的此文件夹/快照的复制减少到1。这将使文件需求减少2/3。只有在快照不是关键的情况下,这样做才是安全的。即使将复制减少到2也可以节省空间,而且可能只够完成。(然后它可以安全地移动到另一个集群(

为什么不创建第三个集群(使用小节点(并使用名称空间联盟来更好地处理数据呢。这可能是一个更长期的解决方案,会让生活变得更好。

最新更新