HDFS在Ubuntu上的故障排查指南
使用systemctl命令查看HDFS核心服務(NameNode、DataNode)的運行狀態,確認服務是否正常啟動:
systemctl status hadoop-hdfs-namenode # 檢查NameNode狀態
systemctl status hadoop-hdfs-datanode # 檢查DataNode狀態
若服務未運行,使用systemctl start命令啟動對應服務;若啟動失敗,需進一步查看日志定位原因。
日志是故障排查的核心依據,HDFS的日志默認存儲在/var/log/hadoop-hdfs/目錄下:
hadoop-<username>-namenode-<hostname>.loghadoop-<username>-datanode-<hostname>.logtail -f命令實時查看日志,重點關注ERROR或WARN級別的信息(如元數據損壞、端口沖突、權限問題):tail -f /var/log/hadoop-hdfs/hadoop-ubuntu-namenode-localhost.log
檢查$HADOOP_HOME/etc/hadoop目錄下的核心配置文件,確保關鍵參數設置正確:
fs.defaultFS(NameNode RPC地址,如hdfs://localhost:9000)配置正確;dfs.namenode.name.dir(NameNode元數據存儲路徑)、dfs.datanode.data.dir(DataNode數據存儲路徑)、dfs.replication(副本數,默認3,單節點可設為1)等參數無誤。source ~/.bashrc使環境變量生效。使用jps命令查看Hadoop相關進程是否正常運行(正常應包含NameNode、DataNode、SecondaryNameNode等):
jps
若進程缺失,需重啟對應服務(start-dfs.sh),并通過日志分析進程終止原因(如端口被占用、權限不足)。
HDFS集群節點間需通過網絡通信,使用ping命令測試節點間的網絡連通性(如DataNode與NameNode之間的通信):
ping <DataNode_IP>
使用netstat或ss命令檢查HDFS所需端口(如NameNode的9000端口、DataNode的50010端口)是否被監聽:
sudo netstat -tuln | grep 9000 # 檢查NameNode端口
sudo ss -tuln | grep 50010 # 檢查DataNode數據傳輸端口
若端口未監聽,需檢查防火墻設置(如ufw)是否允許該端口:
sudo ufw allow 9000/tcp
df -h命令檢查HDFS數據目錄所在磁盤的剩余空間(建議保留至少20%的空閑空間),若空間不足,清理無用文件(如/tmp目錄);hdfs用戶),避免因權限不足導致進程無法訪問:sudo chown -R hdfs:hdfs /usr/local/hadoop/hdfs/namenode # 修改NameNode目錄權限
sudo chown -R hdfs:hdfs /usr/local/hadoop/hdfs/datanode # 修改DataNode目錄權限
NameNode日志,定位具體錯誤(如java.io.IOException: NameNode metadata corrupted);SecondaryNameNode恢復元數據(需提前配置SecondaryNameNode);dfs.namenode.name.dir)并重新格式化:rm -rf /usr/local/hadoop/hdfs/namenode/* # 刪除元數據
hdfs namenode -format # 重新格式化
Safe mode is ON;hdfs dfsadmin命令退出安全模式:hdfs dfsadmin -safemode leave
jps無DataNode進程,日志提示java.io.IOException: Cannot lock storage(磁盤故障)或Connection refused(與NameNode通信失?。?;dfs.datanode.data.dir)是否存在(如磁盤損壞需更換磁盤);ping NameNode),確保DataNode能訪問NameNode的RPC端口;systemctl start hadoop-hdfs-datanode。hdfs dfsadmin -report顯示副本數低于配置值(如dfs.replication=3但實際為1);hdfs dfs -setrep命令手動調整:hdfs dfs -setrep 3 /path/to/file # 將指定文件的副本數設置為3
hdfs dfsadmin -report命令查看集群的整體狀態(包括NameNode信息、DataNode數量、存儲容量、數據塊副本數等);hdfs fsck命令檢查HDFS文件系統的健康狀況(如數據塊丟失、損壞),并可修復部分問題:hdfs fsck / -files -blocks -locations # 檢查根目錄下的所有文件和數據塊
hdfs debug recoverLease /path/to/corrupt/file -retries 3 # 修復損壞的數據塊