問題:
搭建偽Hadoop集群的時候,運行命令:
hdfs namenode -format
格式化或者說初始化namenode。
然后用命令:
start-dfs.sh
來啟動hdfs時,jps發現datanode先是啟動了一下,然后就掛掉了,在http://192.168.195.128:50070 (HDFS管理界面)也看不到datanode的信息。
然后去datanode的日志上面看,看到這樣的報錯:

出錯原因:(來自博客https://blog.csdn.net/qq_30136589/article/details/51638069)
hadoop的升級功能需要data-node在它的版本文件里存儲一個永久性的clusterID,當datanode啟動時會檢查並匹配namenode的版本文件里的clusterID,如果兩者不匹配,就會出現"Incompatible clusterIDs"的異常。
每次格式化namenode都會生成一個新的clusterID, 如果只格式化了namenode,沒有格式化此datanode, 就會出現”java.io.IOException: Incompatible namespaceIDs“異常。
參見官方CCR[HDFS-107]
這就解釋了,為什么我第一次是成功的,后面一直都datanode掛掉的情況。
因為第一次成功后,每次再跑hdfs之前我都格式化或者說初始化了hdfs的配置。然后,namenode的clusterId就會清空,在你跑start-dfs.sh的時候,就會重新生成一個clusterId。但你datanode沒有初始化噢,就是說datanode里面的那個clusterId還是之前那個,於是就出現了兩者不匹配,報錯了。
解決方法:
1.在namenode機器上: 找到${dfs.namenode.name.dir}/current/VERSION 里找到clusterID。這個dfs.namenode,name.dir在hdfs-site.xml可以找到你這個路徑的真正路徑。:

這里的話就是在/home/hadoop/data/name/current下找到VERSION文件,然后里面有個clusterId,找到它復制了:

2.在出問題的datanode上: 找到$dfs.datanode.data.dir,這個也是在hdfs-site.xml配置文件可以找到這個路徑具體的位置:

像我的機器,就是在/home/hadoop/data/data/current下找到VERSION文件,然后里面也有個clusterId:

然后你要做的就是把(1)中復制的namenode的clusterId覆蓋了出問題的datanode的clusterId。
3.在問題節點重新重啟你的datanode,也就是重新跑命令:
start-dfs.sh
然后datanode就重新跑起來了。在瀏覽器上訪問那個管理界面也看到datanode了:

注意:
1.配置完clusterId后不要再hdfs namenode -format格式化或者說初始化namenode了。
2.記得把所有機器的防火牆給關了,不然可能通信上會有所攔截。(反正我一開始沒關,然后配好了clusterId在瀏覽器的Hadoop管理界面上沒能看到datanode,一關掉所有機器的防火牆就好了~)
