hadoop集群启动namenode时,用jps查看datanode没有启动。
原因分析:
由于在core-site.xml,hdfs-site.xml文件中,我没有设置如下内容。
core-site.xml内容如下:
- hadoop.tmp.dir
- file:/usr/local/hadoop/tmp
- Abase for other temporary directories.
- fs.defaultFS
- hdfs://localhost:9000
hdfs-site.xml内容如下:
- dfs.replication
- 1
- dfs.namenode.name.dir
- file:/usr/local/hadoop/tmp/dfs/name
- dfs.datanode.data.dir
- file:/usr/local/hadoop/tmp/dfs/data
导致系统启动后会默认读取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号冲突。