1. 程式人生 > >Hadoop啟動datanode失敗,clusterId有問題

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,一關掉所有機器的防火牆就好了~)