某次故障发现hdfs本身无法提供服务,于是查询dn日志和nn日志:
dn日志:
2024-**-** 12:56:12,683 | WARN | org.apache.hadoop.hdfs.server.datanode.DataNode | ***********:1004:DataXceiverServer
java.io.IOException: Xceiver count 8193 exceeds the limit of concurrent xcievers: 8192
at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:234)
at java.lang.Thread.run(Thread.java:750)
nn日志:
2024-**-** 13:01:49,043 | INFO | org.apache.hadoop.ipc.Server | IPC Server handler 51 on default port 54310, call Call#1803581 Retry#0 org.apache.hadoop.hdfs.protocol.ClientProtocol.addBlock from 10.62.40.159:15127
java.io.IOException: File /hbase/data/***/ct***_****/********/********/***.temp could only be written to 0 of the 1 minReplication nodes. There are 3 datanode(s) running and 3 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2315)
at org.apache.hadoop.hdfs.server.namenode.FSDirWriteFileOp.chooseTargetForNewBlock(FSDirWriteFileOp.java:294)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2994)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:929)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:593)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:614)
at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:582)
at org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:566)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1116)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1060)
at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:983)
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:1890)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2997)
这个错误信息表明在尝试写入 HDFS 文件时遇到了问题。具体来说,错误信息表明:
- 文件路径:
/hbase/data/***/ct***_****/********/********/***.temp
是一个正在尝试写入的临时文件。 - 副本数:文件应该被复制到至少 1 个节点上(
minReplication nodes
),但实际上只能写入到 0 个节点(could only be written to 0 of the 1
)。 - 活动节点:当前有 3 个 DataNode 正在运行(
There are 3 datanode(s) running
)。 - 排除节点:在这次操作中有 3 个节点被排除在外(
3 node(s) are excluded in this operation
)。
这个错误通常意味着以下几种情况之一:
- 网络问题:某些 DataNode 可能无法正常连接到 NameNode 或其他 DataNodes。
- 磁盘问题:某些 DataNode 的磁盘可能出现故障或满载,导致无法写入数据。
- 配置问题:HDFS 的配置可能存在问题,比如
dfs.replication
设置不合理,或者某些节点被配置为排除列表(dfs.hosts.exclude
)。 -
- 权限问题:可能有一些权限设置阻止了文件的写入。
最终操作:
查询dn的连接数,已经大于8192,于是将dfs.datanode.max.xcievers
改为16384后,重启hdfs、hbase集群后,业务恢复正常