最近由于重裝了系統,需要對之前搭建的集群要做些改動。在對每個虛擬機的網絡進行正確的配置之后,重新執行hadoop/sbin/start-dfs.sh命令來啟動HDFS,然而namenode卻無法識別datanode。
后來通過對之前學過的知識進行回顧和梳理發現了問題的所在:
由于場景的改變造成了虛擬機IP地址的改變,在這里雖然在虛擬機中配置網絡的IP也做了相應的改變,但是Hadoop集群中的一些自動生成舊文件的內容依舊和你以前的IP地址有關,這就造成NameNode無法識別之前的DataNode。
解決辦法:
首先了解下namenode初始化工作目錄的形成,我們在執行hdfs namenode -format 時只是初始化了namenode的工作目錄,而datanode的工作目錄是在datanode啟動后自己初始化的。所以在這里首先要把各個DataNode下的工作目錄進行刪除(即HDFS的文件存儲目錄:hddata/dfs/current目錄下的內容全部進行刪除)。(如果某個DataNode的工作目錄未進行刪除,則通過相應的web網頁去看HDFS的存儲內存時依舊觀察不到該DataNode)
其次namenode在format初始化的時候會形成兩個標識:
blockPoolId:
clusterId:
新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識,一旦namenode重新format后,namenode的身份標識已變,而datanode如果依然持有原來的id,就不會被namenode識別。
所以只需要我們把各個DataNode上的工作目錄進行刪除后,然后在對hadoop的bin目錄下執行namenode-format命令即可識別DataNode。