1、重新格式化意味着集群的数据会被全部删除,格式化前需考虑数据备份或转移问题; 
2、先删除主节点(即namenode节点),Hadoop的临时存储目录tmp、namenode存储永久性元数据目录dfs/name、Hadoop系统日志文件目录log 中的内容 (注意是删除目录下的内容不是目录); 
3、删除所有数据节点(即datanode节点) ,Hadoop的临时存储目录tmp、namenode存储永久性元数据目录dfs/name、Hadoop系统日志文件目录log 中的内容; 
4、格式化一个新的分布式文件系统:

$ hadoop namenode -format


注意

(1)Hadoop的临时存储目录tmp(即core-site.xml配置文件中的hadoop.tmp.dir属性,默认值是/tmp/hadoop-${user.name}),如果没有配置hadoop.tmp.dir属性,那么hadoop格式化时将会在/tmp目录下创建一个目录,例如在cloud用户下安装配置hadoop,那么Hadoop的临时存储目录就位于/tmp/hadoop-cloud目录下 

(2)Hadoop的namenode元数据目录(即hdfs-site.xml配置文件中的dfs.namenode.name.dir属性,默认值是${hadoop.tmp.dir}/dfs/name),同样如果没有配置该属性,那么hadoop在格式化时将自行创建。必须注意的是在格式化前必须清楚所有子节点(即DataNode节点)dfs/name下的内容,否则在启动hadoop时子节点的守护进程会启动失败。这是由于,每一次format主节点namenode,dfs/name/current目录下的VERSION文件会产生新的clusterID、namespaceID。但是如果子节点的dfs/name/current仍存在,hadoop格式化时就不会重建该目录,因此形成子节点的clusterID、namespaceID与主节点(即namenode节点)的clusterID、namespaceID不一致。最终导致hadoop启动失败。


hadoop集群启动namenode时,用jps查看datanode没有启动。


原因分析:

由于在core-site.xml,hdfs-site.xml文件中,我没有设置如下内容。

core-site.xml内容如下:


1. <configuration>
2. <property>
3. <name>hadoop.tmp.dir</name>
4. <value>file:/usr/local/hadoop/tmp</value>
5. <description>Abase for other temporary directories.</description>
6. </property>
7. <property>
8. <name>fs.defaultFS</name>
9. <value>hdfs://localhost:9000</value>
10. </property>
11. </configuration>
hdfs-site.xml内容如下:
1. <configuration>
2. <property>
3. <name>dfs.replication</name>
4. <value>1</value>
5. </property>
6. <property>
7. <name>dfs.namenode.name.dir</name>
8. <value>file:/usr/local/hadoop/tmp/dfs/name</value>
9. </property>
10. <property>
11. <name>dfs.datanode.data.dir</name>
12. <value>file:/usr/local/hadoop/tmp/dfs/data</value>
13. </property>
14. </configuration>

导致系统启动后会默认读取linux根目录下的tmp/hadoop-hadoop/下的文件。

如果系统没有重启,这个目录不会被系统清理掉,保存了namenode和datanode相关信息。

这样下次启动hadoop时(不论是重新格式化hdfs文件系统,还是其他操作),hadoop还是会读取默认位置,也就是tmp/hadoop-hadoop/下的文件作为namenode、datanode的配置信息。

而,重新格式化之后,namenode会重新生成,但保存在tmp/hadoop-hadoop中的datanode配置信息,不会重新生成。

两个cluster-ID冲突,导致启动datanode失败。


解决办法:

一:(已验证)

在core-site.xml,hdfs-site.xml文件中,显示确定namenode和datanode配置文件的位置。

设置内容见上。

重启hadoop,成功。无论是重新格式化hdfs,还是仅仅启动namenode、datanode,都没问题。

二: (根据原理推测可行解决方案,未验证)

系统开机后,只执行一次format操作。(如果不小心format了,则可以先删除tmp文件夹,rm -r ./tmp然后在执行format等启动hadoop操作)

后续只是打开namenode和datanode操作。

这样就不生成新的namenode cluster ID,不会导致ID号冲突。