Hadoop啟動datanode失敗,clusterId有問題
問題:
搭建偽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,一關掉所有機器的防火牆就好了~)