某次故障發現hdfs本身無法提供服務,于是查詢dn日志和nn日志:
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集群后,業務恢復正常