无法向HDFS存入文件:2节点Hadoop集群Datanode显示异常求助
排查Hadoop集群主节点无法识别DataNode的问题
我之前搭建Hadoop集群时也碰到过一模一样的情况,别着急,咱们一步步来定位问题:
1. 先检查NameNode和DataNode的Cluster ID一致性
这是最常见的触发原因!如果主节点的NameNode和从节点的DataNode集群ID不匹配,DataNode根本没法成功注册到NameNode上。
- 在主节点执行命令查看NameNode的Cluster ID:
找到cat $HADOOP_HOME/hadoop_data/hdfs/namenode/current/VERSIONclusterID这一行记下来。 - 在从节点执行命令查看DataNode的Cluster ID:
cat $HADOOP_HOME/hadoop_data/hdfs/datanode/current/VERSION - 如果两个ID不一样,按以下步骤修复:
- 在主节点停掉所有Hadoop服务:
stop-all.sh(或者分开执行stop-dfs.sh和stop-yarn.sh) - 在从节点删除DataNode的数据目录:
rm -rf $HADOOP_HOME/hadoop_data/hdfs/datanode - 回到主节点重新格式化NameNode:
hdfs namenode -format - 重启所有服务:
start-all.sh
- 在主节点停掉所有Hadoop服务:
2. 验证集群配置文件的一致性和正确性
主从节点的核心配置文件必须完全一致,参数也不能出错:
- 检查主节点的
core-site.xml,确认fs.defaultFS配置的是主节点的主机名/IP+端口,比如:<property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> - 检查
hdfs-site.xml,确保dfs.namenode.name.dir(主节点)和dfs.datanode.data.dir(从节点)的路径正确,另外dfs.replication建议设置为2(适配你的2节点集群)。 - 确认主节点的
workers文件(旧版本叫slaves)里已经正确写入从节点的主机名,而且主从节点的/etc/hosts文件都配置了对方的IP和主机名映射(避免主机名解析失败)。 - 要是配置文件有修改,记得用
scp同步到从节点,比如:scp $HADOOP_HOME/etc/hadoop/* slave:$HADOOP_HOME/etc/hadoop/
3. 查看日志找具体错误
日志是排查问题的核心依据,别跳过这一步:
- 主节点查看NameNode日志:
tail -f $HADOOP_HOME/logs/hadoop-*-namenode-*.log - 从节点查看DataNode日志:
常见的错误关键词:tail -f $HADOOP_HOME/logs/hadoop-*-datanode-*.logClusterId mismatch、Connection refused、Permission denied,日志里会明确告诉你哪里出了问题。
4. 确认DataNode是否成功注册到NameNode
- 访问NameNode的Web UI(Hadoop 3.x默认端口是9870,2.x是50070),进入
Datanodes页面,如果看不到从节点的DataNode,说明注册失败,结合日志继续排查。 - 也可以在主节点执行命令查看集群状态:
看输出里的hdfs dfsadmin -reportLive datanodes数量,如果是1(只有主节点),那就是从节点没注册上。
5. 检查防火墙和端口通信
虽然SSH能通,但Hadoop服务需要的端口可能被防火墙挡住了:
- 主从节点都临时关闭防火墙测试(比如CentOS:
systemctl stop firewalld,Ubuntu:ufw disable),然后重启Hadoop服务看是否正常。 - 或者手动开放需要的端口:NameNode的9000/9870,DataNode的50010/9864等。
- 可以在主节点测试和从节点DataNode端口的连通性:
如果连接失败,说明端口被拦截了。telnet slave 50010
按照上面的步骤排查,大概率能解决问题,要是还有疑问可以把日志里的错误信息贴出来,我再帮你分析~
内容的提问来源于stack exchange,提问作者Syed Mostofa Monsur Dipto




