执行hdfs dfs -mkdir /app时Active NameNode异常终止问题求助
问题分析与解决步骤
问题现象
执行hdfs dfs -mkdir /app时,Active NameNode(apache-hadoop-namenode-0)异常终止,写操作失败。
关键日志解析(已翻译)
$ oc exec -it apache-hadoop-namenode-0 -c namenode -- bash $ hdfs dfs -mkdir /app 警告: HADOOP_PREFIX已被HADOOP_HOME替代,将使用HADOOP_PREFIX的值。 {"name":"org.apache.hadoop.io.retry.RetryInvocationHandler","time":1661110979165,"date":"2022-08-21 19:42:59,165","level":"INFO","thread":"main","message":"java.io.EOFException: 本地主机与目标主机之间出现文件结束异常:本地主机为\"apache-hadoop-namenode-0.apache-hadoop-namenode.nom-backend.svc.cluster.local/10.128.3.182\"; 目标主机为\"apache-hadoop-namenode-0.apache-hadoop-namenode.nom-backend.svc.cluster.local\":8020; 异常为java.io.EOFException。调用ClientNamenodeProtocolTranslatorPB.mkdirs接口访问该节点时触发异常,将立即尝试故障转移。"} {"name":"org.apache.hadoop.io.retry.RetryInvocationHandler","time":1661110979206,"date":"2022-08-21 19:42:59,206","level":"INFO","thread":"main","message":"org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): 备用状态不支持WRITE类操作。 \tat org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:108) \tat org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:2094) \tat org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1550) \tat org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3397) \tat org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:1159) \tat org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:740) \tat org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) \tat org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:604) \tat org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:572) \tat org.apache.hadoop.ipc.ProtobufRpcEngine2$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine2.java:556) \tat org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1093) \tat org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:1043) \tat org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:971) \tat java.security.AccessController.doPrivileged(Native Method) \tat javax.security.auth.Subject.doAs(Subject.java:422) \tat org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878) \tat org.apache.hadoop.ipc.Server$Handler.run(Server.java:2976) 调用ClientNamenodeProtocolTranslatorPB.mkdirs接口访问apache-hadoop-namenode-1.apache-hadoop-namenode.nom-backend.svc.cluster.local/10.131.0.246:8020时触发该异常,已尝试1次故障转移,将等待830ms后再次尝试。"} {"name":"org.apache.hadoop.io.retry.RetryInvocationHandler","time":1661110980038,"date":"2022-08-21 19:43:00,038","level":"INFO","thread":"main","message":"java.net.ConnectException: 从apache-hadoop-namenode-0.apache-hadoop-namenode.nom-backend.svc.cluster.local/10.128.3.182连接到该节点8020端口失败,连接异常为java.net.ConnectException: 连接被拒绝。调用ClientNamenodeProtocolTranslatorPB.mkdirs接口时触发该异常,已尝试2次故障转移,将等待2255ms后再次尝试。"}
日志核心问题
- 原Active NameNode服务异常终止,导致连接出现EOF异常,后续重试时直接被拒绝。
- HA集群自动故障转移未正常触发:Standby节点未切换为Active状态,写操作被拒绝。
解决步骤
检查NameNode状态
执行命令确认两个节点的服务状态:hdfs haadmin -getServiceState apache-hadoop-namenode-0 hdfs haadmin -getServiceState apache-hadoop-namenode-1手动触发故障转移
如果Standby节点仍处于备用状态,手动将其切换为Active:hdfs haadmin -failover apache-hadoop-namenode-0 apache-hadoop-namenode-1执行完成后再次验证节点状态,确认apache-hadoop-namenode-1已变为Active。
排查原Active节点终止原因
进入原节点查看详细日志,定位服务终止根因:oc exec -it apache-hadoop-namenode-0 -c namenode -- bash # 日志路径需根据实际部署调整 cat /var/log/hadoop/hdfs/hadoop-hdfs-namenode-apache-hadoop-namenode-0.log常见原因包括:内存不足、磁盘空间耗尽、ZKFC进程故障、元数据损坏等。
修复原节点并恢复HA冗余
根据排查结果修复问题后,重新启动原节点的NameNode服务,使其回到Standby状态:oc exec -it apache-hadoop-namenode-0 -c namenode -- hdfs --daemon start namenode验证自动故障转移配置
检查hdfs-site.xml中的HA配置,确保自动故障转移已启用:<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>同时确认ZKFC进程在两个节点上均正常运行:
oc exec -it apache-hadoop-namenode-0 -c namenode -- jps | grep DFSZKFailoverController oc exec -it apache-hadoop-namenode-1 -c namenode -- jps | grep DFSZKFailoverController
内容的提问来源于stack exchange,提问作者Abhishek Karigar
相关产品推荐
相关产品推荐

