hadoop常見錯誤及處理方法
如果大家在安裝的時候遇到問題,或者按步驟安裝完後卻不能執行Hadoop,那麼建議仔細檢視日誌資訊,Hadoop記錄了詳盡的日誌資訊,日誌檔案儲存在logs資料夾內。
無論是啟動,還是以後會經常用到的MapReduce中的每一個job,以及HDFS等相關資訊,Hadoop均存有日誌檔案以供分析。
1、hadoop-root-datanode-master.log 中有如下錯誤:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in導致datanode啟動不了。
原因:每次namenode format會重新建立一個namenodeId,而dfs.data.dir引數配置的目錄中包含的是上次format建立的id,和dfs.name.dir引數配置的目錄中的id不一致。namenode format清空了namenode下的資料,但是沒有清空datanode下的資料,導致啟動時失敗,所要做的就是每次fotmat前,清空dfs.data.dir引數配置的目錄.
格式化hdfs的命令
Shell程式碼
- hadoop namenode -format
2、如果datanode連線不上namenode,導致datanode無法啟動。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to ... failed on local exception: java.net.NoRouteToHostException: No route to host
關閉防火牆 Shell程式碼
- service iptables stop
機器重啟後,防火牆還會開啟。
3、從本地往hdfs檔案系統上傳檔案,出現如下錯誤:
INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink
INFO hdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023
WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.
解決方法:
關閉防火牆:
Shell程式碼
- service iptables stop
禁用selinux:
編輯 /etc/selinux/config檔案,設定“SELINUX=disabled”
4、安全模式導致的錯誤
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分散式檔案系統啟動的時候,開始的時候會有安全模式,當分散式檔案系統處於安全模式的情況下,檔案系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上資料塊的有效性,同時根據策略必要的複製或者刪除部分資料塊。執行期通過命令也可以進入安全模式。在實踐過程中,系統啟動的時候去修改和刪除檔案也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。
Java程式碼
- hadoop dfsadmin -safemode leave
5、以本地模式執行hadoop時,拋異常
ERROR security.UserGroupInformation: PriviledgedActionException as:hadoop cause:java.net.UnknownHostException: hadoop: hadoop: Name or service not known
Exception in thread "main" java.net.UnknownHostException: hadoop: hadoop: Name or service not known
把/etc/hostname檔案中的主機名加入到/etc/hosts檔案中,問題解決。
6、格式化hdfs檔案系統時,出錯:
Format aborted in /home/hadoop/dfs/name
/home/hadoop/dfs/name 是 dfs.name.dir 配置的本地路徑,把這個目錄刪除,
再格式化就可以了。
7、datanode無法啟動,datanode的日誌中有error:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: All directories in dfs.data.dir are invalid
發現日誌前一行有warn:WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Invalid directory in dfs.data.dir: Incorrect permissi on for /home/hadoop/dfs/data, expected: rwxr-xr-x, while actual: rwxrwxr-x
按照日誌修改了目錄的訪問許可權,問題解決。
8.hadoopdatanode啟動不起
例如:
NameNode和DataNode的namespaceID不一致,這個錯誤是很多人在安裝時會遇到的,日誌資訊為:
java.io.IOException: Incompatible namespaceIDs in/root/tmp/dfs/data:
NameNode namespaceID = 1307672299; DataNode namespaceID =389959598
若HDFS一直沒有啟動,讀者可以查詢日誌,並通過日誌進行分析,以上提示資訊顯示了NameNode和DataNode的namespaceID不一致。
這個問題一般是由於兩次或兩次以上的格式化NameNode造成的,有兩種方法可以解決,第一種方法是刪除DataNode的所有資料(及將叢集中每個datanode的/hdfs/data/current中的VERSION刪掉,然後執行hadoopnamenode-format重啟叢集,錯誤消失。<推薦>);第二種方法是修改每個DataNode的namespaceID(位於/hdfs/data/current/VERSION檔案中)<優先>或修改NameNode的namespaceID(位於/hdfs/name/current/VERSION檔案中),使其一致。
下面這兩種方法在實際應用中也可能會用到。
1)重啟壞掉的DataNode或JobTracker。當Hadoop叢集的某單個節點出現問題時,一般不必重啟整個系統,只須重啟這個節點,它會自動連入整個叢集。
在壞死的節點上輸入如下命令即可:
bin/Hadoop-daemon.sh start DataNode
bin/Hadoop-daemon.sh start jobtracker
2) 動態加入DataNode或TaskTracker。這個命令允許使用者動態將某個節點加入叢集中。
bin/Hadoop-daemon.sh --config ./conf startDataNode
bin/Hadoop-daemon.sh --config ./conf start tasktracker
9.強行關機或hadoop意外中斷會出現這種錯誤:
not start task tracker because java.io.IOException: Failed to set permissions o
f path: \app\hadoop\tmp\mapred\local\ttprivate to 0700
source name ugi already exists
重新格式化也不行,總是提示 Re-format filesystem in
刪除hadoop節點的data臨時目錄,就是core-site.xml的hadoop.tmp.dir配置的那個系統檔案目錄, 注意,不是hdfs的那個目錄(hls -ls 看到的那個目錄),必須是作業系統直接看到的那個臨時目錄。然後重新格式化就可以解決問題。
10. 錯誤:Format aborted in /usr/local/hadoop/hdfsconf/name,啟動後發現發現http://das0:5007無法顯示。
將/data0/hadoop-name資料夾整個刪除。然後再格,成功!!!
在對namenode格式化之前,要確保dfs.name.dir引數指定的目錄不存在。 Hadoop這樣做的目的是防止錯誤地將已存在的叢集格式化了11.2013-05-13 16:18:18,624 WARNorg.apache.hadoop.metrics2.impl.MetricsSystemImpl: Source name ugialready exists!2013-05-13 16:18:22,916 ERRORorg.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException: Call to /222.25.189.41:9000 failed on localexception: java.io.IOException:
重新格式化還是不能解決。 解決辦法:手動刪除hadoop.tmp.dir屬性下的所有檔案和目錄,然後重新格式化即可12.ERROR namenode.NameNode: java.io.IOException: Cannot create directory /export/home/dfs/name/current
ERROR namenode.NameNode: java.io.IOException: Cannot remove current directory: /usr/local/hadoop/hdfsconf/name/current
原因是 沒有設定 /usr/hadoop/tmp 的許可權沒有設定, 將之改為:
chown –R hadoop:hadoop /usr/hadoop/tmp
sudo chmod -R a+w /usr/local/hadoop