最近配置Hadoop的時候出現了這麼一個現象,啓動以後,使用jps命令以後是這樣的:java
看不到DataNode進程,可是可以正常的工做,是否是很神奇啊?node
在一番百度谷歌以後,得出告終論:程序員
我在啓動Hadoop以前和啓動以後,曾經屢次使用以下命令,針對NameNode進行格式化:分佈式
hadoop namenode -format
這個問題,還不是你直接屢次格式化形成的,而是你格式化以後,啓動了Hadoop,而後將Hadoop關閉,從新格式化,再啓動Hadoop形成的,這個時候你就發現,DataNode線程在jps命令中消失了,還能正常使用,就如我開頭的那張圖同樣。形成這個問題的根源,是NameNode和DataNode的版本號不一致所致。這個問題不單單會出如今僞分佈式,徹底分佈式中也會出現。這裏以僞分佈式進行展現。oop
以下是正常的兩個文件的信息。ui
NameNode VERSION文件信息:spa
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是一組的。3d
那麼這兩個文件存放在哪裏呢?以下是你在Hadoop配置文件core-site.xml中的一項,就在此項指定的目錄之下。code
<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進行替換,保存以後重啓,那麼就能夠正常的使用了。查找的的路徑,已經在上圖中進行了展現,這裏不作贅述。
就以上問題,目前我只想到兩個解決方案,若是還有,我會在這裏進行更新。