Hadoop 叢集運維中最常遇到的 4 類錯誤及其根因、解決步驟。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode:
java.io.IOException: Incompatible namespaceIDs in...
原因:NameNode 格式化 (hadoop namenode -format) 會產生新的 namespaceID,但 DataNode 資料目錄 (dfs.data.dir) 仍保留舊 ID,兩者不一致導致 DataNode 拒絕啟動。
解決:
dfs.data.dir 目錄內容 (或整個目錄)。hadoop namenode -format。預防:每次格式化 NameNode 前,務必同步清空所有 DataNode 資料目錄。
ERROR ... DataNode: java.io.IOException: Call to ... failed on local exception:
java.net.NoRouteToHostException: No route to host
原因:防火牆阻擋 DataNode ↔ NameNode 通訊埠 (預設 9000, 50010, 50020, 50075, 50070 等)。
解決:
# 暫時關閉 (測試環境)
service iptables stop
# 或永久關閉
chkconfig iptables off
# 生產環境建議:精確開放埠
iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
iptables -A INPUT -p tcp --dport 50010 -j ACCEPT
... (其他埠)
service iptables save
注意:機器重啟後防火牆可能自動開啟,需設定開機自動關閉或開放埠規則持久化。
INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.io.IOException: Bad connect ack with firstBadLink
WARN hdfs.DFSClient: DataStreamer Exception:
java.io.IOException: Unable to create new block.
原因:同上,防火牆/SELinux 阻擋 DataNode 間或 Client→DataNode 的資料傳輸埠。
解決:
/etc/selinux/config,設定 SELINUX=disabled,重啟機器。org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
原因:NameNode 啟動進入安全模式,檢查區塊複製數、修復損壞區塊,期間檔案系統唯讀。
解決:
hadoop dfsadmin -safemode leave
hadoop dfsadmin -safemode enter
$HADOOP_HOME/logs/hadoop-*-namenode-*.log 與 *-datanode-*.log。hadoop fsck / 檢查檔案系統健康度。