前言

        搭建一个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的目录下,例如:

datanode hadoop 作用 hadoop中datanode启动不了_Hadoop

cd $HADOOP_HOME/logs,进入Hadoop日志文件目录,然后查看后缀带有.log的文件,都是日志文件。

datanode hadoop 作用 hadoop中datanode启动不了_datanode hadoop 作用_02

       如上图所示,在我们进入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/目录下:

datanode hadoop 作用 hadoop中datanode启动不了_HDFS_03

hdfs-site.xml

datanode hadoop 作用 hadoop中datanode启动不了_HDFS_04

       其中,hadoopDatas目录及其子目录是通过配置在集群启动时自动生成的。


datanode hadoop 作用 hadoop中datanode启动不了_hadoop_05

datanode hadoop 作用 hadoop中datanode启动不了_Hadoop_06

       如上图所示,进入 hadoopDatas/datanodeDatas/current 目录下有一个名为 VERSION 的文件,该文件包含了HDFS集群的信息,我们可以使用 cat 或者 vim 命令查看VERSION文件的内容。同样,在namenodeDatas/current目录下查看VERSION文件的内容。


       查看NameNode节点的clusterID

datanode hadoop 作用 hadoop中datanode启动不了_datanode hadoop 作用_07

 

datanode hadoop 作用 hadoop中datanode启动不了_Hadoop_08

       同样的方法查看DataNode节点的clusterID进行比较,通过查看将会发现两者的clusterID不一样。


3.    解决方案

       停止HDFS集群后,3台虚拟机同时删除NameNode节点和DataNode节点中配置的存储Hadoop数据的文件目录。即删除hadoopDatas目录:

datanode hadoop 作用 hadoop中datanode启动不了_HDFS_09

       接下来再使用 hdfs namenode -format 命令重新格式化NameNode节点,然后重新启动HDFS集群即可。