1. 程式人生 > >Hadoop 數據節點DataNode異常

Hadoop 數據節點DataNode異常

ora ati port com common cep 數據節點 數據 dha

轉載自 :http://blog.csdn.net/gis_101/article/details/52679914

1、問題背景

操作系統:CentOS7 64位
Hadoop版本:Hadoop2.7.3
JDK:1.8.0_65

2、問題描述

使用start-all.sh腳本或者先後執行start-dfs.sh、start-yarn.sh腳本啟動Hadoop後,通過jps命令檢測DataNode節點進程發現有DataNode進程,數秒後DataNode進程莫名其妙“消失”了,只有Jps、NodeManager兩個進程。簡而言之就是DataNode進程異常,由於某種原因導致無法啟動或者啟動後數據節點DataNode進程自動關閉。

3、問題原因

通過查看DataNode節點日誌,報Incompatible clusterIDs異常。(註意如果沒有配置hadoop日誌路徑默認在$HADOOP_INSTALL/logs目錄下,也就是安裝目錄的logs文件夾裏,當然可以修改hadoop-env.sh文件中的HADOOP_LOG_DIR,比如加入export HADOOP_LOG_DIR=/var/log/hadoop)。DataNode節點日誌文件異常信息如下:

/**************************************************/
2016-09-26 16:38:56,122 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/tmp/hadoop-hadoop/dfs/data/
java.io.IOException:

Incompatible clusterIDs in /tmp/hadoop-hadoop/dfs/data: namenode clusterID = CID-1ac4e49a-ff06-4a34-bfa2-4e9d7248855b; datanode clusterID = CID-3ae02e74-742f-4915-92e7-0625fa8afcc5
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:775)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadStorageDirectory(DataStorage.java:300)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadDataStorage(DataStorage.java:416)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocations(DataStorage.java:395)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:573)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1362)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1327)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:317)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:223)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:802)
at java.lang.Thread.run(Thread.java:745)
2016-09-26 16:38:56,124 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool (Datanode Uuid unassigned) service to s0/192.168.48.134:8020. Exiting.
java.io.IOException:
All specified directories are failed to load.
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:574)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1362)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1327)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:317)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:223)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:802)
at java.lang.Thread.run(Thread.java:745)
2016-09-26 16:38:56,124 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Ending block pool service for: Block pool (Datanode Uuid unassigned) service to s0/192.168.48.134:8020
2016-09-26 16:38:56,226 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Removed Block pool (Datanode Uuid unassigned)
2016-09-26 16:38:58,227 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Exiting Datanode
2016-09-26 16:38:58,228 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 0
2016-09-26 16:38:58,232 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:
/**************************************************/

日誌文件分析如下:
首先日誌警告,“Failed to add storage directory [DISK]file:/tmp/hadoop-hadoop/dfs/data/
”添加存儲文件失敗,失敗路勁位於“/tmp/hadoop-hadoop/dfs/data/”。緊接著報Java IO異常“java.io.IOException”,異常信息裏顯示的是,namenode和datanode的clusterID不一致,這些異常就導致了後面提示初始化失敗、DataNode進程退出等異常、警告信息。網上很多其他博主說,這是因為多次對namenode進行format導致的。將namenode和datanode的clusterID和namespaceID修改一致即可。的確,進行了兩次format操作,但是修改過後仍然報同樣的問題,通過對比”/tmp/hadoop-hadoop/dfs/data/current/VERSION”文件發現VERSION文件裏clusterID都是一致的,其他的信息也一致。

4、解決方案

由於無法通過直接修改VERSION文件裏clusterID、namespaceID解決問題。於是嘗試重命名了一下各個數據節點DataNode“/tmp/hadoop-hadoop/dfs/data/”目錄下current文件夾,再重新啟動hadoop,發現hadoop運行起來了。各個數據節點的DataNode、NodeManager等進程信息正常,查看各個節點的日誌,一切顯示正常。然後查看了一下“/tmp/hadoop-hadoop/dfs/data/”目錄,發現自動創建了一個current目錄。

5、總結

該問題因為多次對namenode進行format,每一次format主節點NameNode產生新的clusterID、namespaceID,於是導致主節點的clusterID、namespaceID與各個子節點DataNode不一致。當format過後再啟動hadoop,hadoop嘗試創建新的current目錄,但是由於已存在current目錄,導致創建失敗,最終引起DataNode節點的DataNode進程啟動失敗,從而引起hadoop集群完全啟動失敗。因此可以通過直接刪除數據節點DataNode的current文件夾,進行解決該問題。

Hadoop 數據節點DataNode異常