前言
搭建一个HDFS集群,用了3台虚拟机,1台虚拟机是node1作为NameNode节点;3台虚拟机(另外两台虚拟机分别为node2,node3)分别启动DataNode节点,详情参考Hadoop集群环境搭建。
1. 问题描述
HDFS集群搭建并启动成功,一个NameNode节点和三个DataNode节点也运行正常,可以在各自虚拟机中jps命令查看正在运行的Java进程,但是在HDFS集群关闭之后,使用hdfs namenode -format命令刷新NameNode节点格式,重新启动集群,发现仅能成功启动NameNode节点,DataNode节点启动失败。
2. 分析原因
在启动集群的时候,我们可以通过集群日志来查看错误信息,默认的日志位置在Hadoop的安装目录的logs的目录下,例如:
配置好环境变量的情况下可以直接输入指令cd $HADOOP_HOME/logs
,进入Hadoop日志文件目录,然后查看后缀带有.log
的文件,都是日志文件。
如上图所示,在我们进入logs
目录之后可以使用cat或者vim等指令查看日志文件,我们需要查看的是hadoop-root-datanode-node1.log
,其会记录集群在启动和运行过程中的日志信息,如果出现异常或者错误,查看对应的日志文件是一个很好的定位问题的方法。
之所以出现上述问题,其根本原因在于我们使用hdfs namenode -format
命令刷新了NameNode节点的格式后,会重新生成集群的相关信息,特别是clusterID,每次刷新都会生成一个新的clusterID;但是当我们在NameNode节点所在的虚拟机刷新格式后,并不会影响本机以外的DataNode节点,也就是说,另外两台配置DataNode节点的虚拟机上关于集群的信息并不会刷新,仍然保留上一次(未刷新NameNode格式之前)的集群信息,这就导致了NameNode节点和DataNode节点的clusterID不一致的情况,因此DataNode节点不能连接到NameNode节点。我们可以到Hadoop安装目录下的/export/server/hadoop-2.7.5/etc/hadoop/
目录下:
查看 hdfs-site.xml 文件来获取Hadoop数据存储的位置,这个位置也是我们之前在配置集群时设置的:
其中,hadoopDatas目录及其子目录是通过配置在集群启动时自动生成的。
如上图所示,进入 hadoopDatas/datanodeDatas/current 目录下有一个名为 VERSION 的文件,该文件包含了HDFS集群的信息,我们可以使用 cat 或者 vim 命令查看VERSION文件的内容。同样,在namenodeDatas/current目录下查看VERSION文件的内容。
查看NameNode节点的clusterID:
同样的方法查看DataNode节点的clusterID进行比较,通过查看将会发现两者的clusterID不一样。
3. 解决方案
停止HDFS集群后,3台虚拟机同时删除NameNode节点和DataNode节点中配置的存储Hadoop数据的文件目录。即删除hadoopDatas目录:
接下来再使用 hdfs namenode -format
命令重新格式化NameNode节点,然后重新启动HDFS集群即可。
参考:https://blog.csdn.net/qq_43494678/article/details/109205714