DataNode進程不見了 問題描述 最近配置Hadoop的時候出現了這麼一個現象,啟動之後,使用jps命令之後是這樣的: 看不到DataNode進程,但是能夠正常的工作,是不是很神奇啊? 在一番百度谷歌之後,得出了結論: 我在啟動Hadoop之前和啟動之後,曾經多次使用如下命令,針對NameNod ...
DataNode進程不見了
問題描述
最近配置Hadoop的時候出現了這麼一個現象,啟動之後,使用jps命令之後是這樣的:
看不到DataNode進程,但是能夠正常的工作,是不是很神奇啊?
在一番百度谷歌之後,得出了結論:
我在啟動Hadoop之前和啟動之後,曾經多次使用如下命令,針對NameNode進行格式化:
hadoop namenode -format
這個問題,還不是你直接多次格式化造成的,而是你格式化之後,啟動了Hadoop,然後將Hadoop關閉,重新格式化,再啟動Hadoop造成的,這個時候你就發現,DataNode線程在jps命令中消失了,還能正常使用,就如我開頭的那張圖一樣。造成這個問題的根源,是NameNode和DataNode的版本號不一致所致。這個問題不僅僅會出現在偽分散式,完全分散式中也會出現。這裡以偽分散式進行展示。
如下是正常的兩個文件的信息。
NameNode VERSION文件信息:
namespaceID=51628800
clusterID=CID-97bb16dc-c439-427c-9841-5e6e4667cb65
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1918730739-172.17.241.131-1526803461127
layoutVersion=-63
DataNode VERSION文件信息:
storageID=DS-4281731b-7a44-4c86-8844-e1927a4fc966
clusterID=CID-97bb16dc-c439-427c-9841-5e6e4667cb65
cTime=0
datanodeUuid=197c3d68-454b-4287-a5e5-90c01ed9be53
storageType=DATA_NODE
layoutVersion=-56
所謂版本號不一致,就是說的clusterID的值,上面的信息展示的是一致的,也表明NameNode和DataNode是一組的。
那麼這兩個文件存放在哪裡呢?如下是你在Hadoop配置文件core-site.xml中的一項,就在此項指定的目錄之下。
<property>
<!--用來指定hadoop運行時產生文件的存放目錄-->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop-2.7.1/tmp</value>
</property>
那我就以我這個配置的路徑來進行查找,首先到tmp目錄下:
如上圖是完整的查找路徑。
問題分析
下麵進行此問題的分析:
當第一次格式化,啟動Hadoop的時候,沒有任何問題,任何環節都是新產生的,所以哪怕你在啟動Hadoop之前進行多次的NameNode格式化都可以,因為在Hadoop啟動之前,DataNode的版本還沒有生成,只有Hadoop啟動之後DataNode的版本等響應信息才會在指定的目錄下生成,這個時候就產生了NameNode和DataNode的一對一的關係。
當你關掉Hadoop之後進行二次NameNode格式化的時候,NameNode的版本信息等進行了重新寫入,內容肯定和之前的不一樣,這樣就造成了,上文中我提到的clusterID不一致的問題,這樣,你再次啟動Hadoop,所有功能都正常使用,但唯獨jps命令下看不到DataNode線程,這當然會使我們每個程式員感到驚慌,怎麼辦?
解決方案
方案一
首先,在格式化之前,將你設置的存儲Hadoop信息目錄下清空,即我上圖中的例子tmp目錄,將此目錄清空即可。也可直接刪除此目錄,然後新建一個。
然後,進行格式化,這樣所產生的NameNode和DataNode信息都是新的,也都是一組的,問題就解決了,這個是最簡單最有效的方法。
方案二
如果有數據還在,又不想清空數據,那麼這個方案就是你的福音。
既然是版本號不一致產生的問題,那麼我們就單獨解決版本號的問題,將你格式化之後的NameNode的VERSION文件找到,然後將裡面的clusterID進行複製,再找到DataNode的VERSION文件,將裡面的clusterID進行替換,保存之後重啟,那麼就可以正常的使用了。查找的的路徑,已經在上圖中進行了展示,這裡不做贅述。
就以上問題,目前我只想到兩個解決方案。