HDFS故障排查步骤
使用hdfs dfsadmin -report命令获取集群核心指标(DataNode数量、健康状况、存储容量、副本因子满足情况等),快速识别集群是否处于正常运行状态。同时,通过NameNode(默认http://namenode-host:50070)和DataNode(默认http://datanode-host:50075)的Web界面,查看实时告警或错误信息(如DataNode离线、副本不足等)。
日志是故障定位的关键依据,NameNode日志(通常位于$HADOOP_HOME/logs/hadoop-*-namenode-*.log)记录元数据操作、副本同步等关键事件,DataNode日志($HADOOP_HOME/logs/hadoop-*-datanode-*.log)记录数据块接收、心跳发送等状态。使用tail -f实时监控日志,或通过grep "ERROR\|WARN"过滤异常信息(如java.io.IOException、Disk Error等)。
HDFS依赖节点间稳定的网络通信,使用ping <节点IP>检查节点间连通性,netstat -tuln | grep <端口>(如50070、50075、50010等)确认服务端口是否正常监听。若存在网络分区或防火墙拦截,需调整防火墙规则(如iptables或firewalld)放行必要端口。
df -h查看DataNode磁盘使用情况,确保剩余空间大于HDFS预留值(默认dfs.datanode.du.reserved为10%),避免因磁盘满导致数据块无法写入。top、htop或free -h检查NameNode/ DataNode的内存占用(避免OutOfMemoryError)和CPU负载(避免过高导致GC停顿),必要时调整JVM堆大小(如hadoop_namenode_opts设置-Xmx)。使用hdfs fsck命令全面扫描文件系统,常用选项:-files(显示文件名)、-blocks(显示块信息)、-locations(显示块分布)、-delete(删除不可恢复的损坏文件)。例如:
hdfs fsck / -files -blocks -locations
该命令可识别损坏块、丢失块或副本不足的文件,根据输出结果采取修复措施(如增加副本数hdfs dfs -setrep 3 /path)。
hdfs dfsadmin -safemode leave退出安全模式(仅在集群正常时可用)。DISK_ERROR:dfs.datanode.data.dir目录权限不足(需设置为hadoop:hadoop);NO_SPACE_LEFT:调整dfs.datanode.du.reserved释放空间;INVALID_VERSION:统一集群Hadoop版本。hdfs fsck显示“Under replicated blocks”,检查网络分区(dfs.namenode.replication.work.multiplier.per.iteration设置)、磁盘满或配置错误(dfs.replication是否一致)。借助Ganglia、Prometheus+Grafana等监控工具,可视化集群状态(如NameNode内存、DataNode心跳延迟、块复制速率),快速定位性能瓶颈(如某节点磁盘I/O过高导致块传输缓慢)。
若上述步骤无法解决故障,可尝试重启NameNode和DataNode服务(stop-dfs.sh停止,start-dfs.sh启动)。重启前需备份NameNode数据目录(dfs.namenode.name.dir)和DataNode数据目录(dfs.datanode.data.dir),避免数据丢失。