You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法向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/VERSION
    
    找到clusterID这一行记下来。
  • 从节点执行命令查看DataNode的Cluster ID:
    cat $HADOOP_HOME/hadoop_data/hdfs/datanode/current/VERSION
    
  • 如果两个ID不一样,按以下步骤修复:
    1. 在主节点停掉所有Hadoop服务:stop-all.sh(或者分开执行stop-dfs.shstop-yarn.sh
    2. 在从节点删除DataNode的数据目录:rm -rf $HADOOP_HOME/hadoop_data/hdfs/datanode
    3. 回到主节点重新格式化NameNode:hdfs namenode -format
    4. 重启所有服务:start-all.sh

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-*.log
    
    常见的错误关键词:ClusterId mismatchConnection refusedPermission denied,日志里会明确告诉你哪里出了问题。

4. 确认DataNode是否成功注册到NameNode

  • 访问NameNode的Web UI(Hadoop 3.x默认端口是9870,2.x是50070),进入Datanodes页面,如果看不到从节点的DataNode,说明注册失败,结合日志继续排查。
  • 也可以在主节点执行命令查看集群状态:
    hdfs dfsadmin -report
    
    看输出里的Live 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

火山引擎 最新活动