Ubuntu 上排查与修复 HDFS 故障的实用流程
一、快速自检与恢复步骤
- 查看进程与端口
- 执行:jps,确认存在 NameNode、DataNode、SecondaryNameNode(伪分布式)。
- 执行:netstat -tlpn | grep -E ‘9000|9870’,确认 9000(RPC)与 9870(NameNode Web)处于监听状态。
- 检查 NameNode Web
- 访问:http://:9870(旧版本可能为 50070),查看 Live Nodes、Decommissioning/Entering Maintenance 节点数、Block 报表。
- 一致性检查与修复
- 执行:hdfs fsck /,关注 Under-replicated、Corrupt、Missing blocks 等指标。
- 若处于安全模式且副本不足,先修复副本,再退出:
- 修复副本:hdfs dfsadmin -setBalancerBandwidth 104857600(示例 100MB/s,按磁盘与网络调整)
- 均衡:hdfs balancer -threshold 5
- 退出安全模式:hdfs dfsadmin -safemode leave
- 若存在损坏文件且可丢弃:
- 执行:hdfs fsck / -delete(会删除损坏块对应文件,谨慎使用)。
- 服务重启顺序
- 停止:sbin/stop-dfs.sh
- 启动:sbin/start-dfs.sh(伪分布式也可用 start-all.sh)
以上步骤覆盖了进程、端口、Web 状态、副本与健康检查、以及安全模式处理,是定位 HDFS 故障的高频有效路径。
二、常见故障与对应修复
| 症状 |
快速定位 |
修复建议 |
| jps 看不到 DataNode |
查看 DataNode 日志($HADOOP_LOG_DIR/hadoop--datanode-.log);核对 dfs.datanode.data.dir 权限与磁盘空间 |
若因 clusterID 不一致 导致,先停集群,统一 NameNode 与 DataNode 的 version 文件中的 clusterID,再启动;或(会清空数据)停集群、删除 dfs 数据目录 与 NameNode 元数据目录、执行 hdfs namenode -format、再启动 |
| 本机访问虚拟机 HDFS 报 Connection refused |
在虚拟机内:telnet localhost 9000;在本机:telnet 9000;检查 core-site.xml 的 fs.defaultFS=hdfs://:9000;检查 /etc/hosts 映射(避免 127.0.0.1 );检查 netstat -tlpn 监听地址是否为 0.0.0.0 而非仅 127.0.0.1 |
修正 /etc/hosts 与 fs.defaultFS 一致的主机名/IP;确保监听在 0.0.0.0:9000;本机 hosts 添加 ;必要时关闭防火墙 sudo ufw disable |
| Permission denied |
查看 HDFS 权限 与当前用户;检查 dfs.permissions.enabled |
临时方案:hdfs dfs -chmod -R 777 /user/;或在客户端设置 HADOOP_USER_NAME=<有权限的用户>;生产建议保留权限控制,按用户/组授权 |
| 进入 Safe mode,块缺失/副本不足 |
hdfs dfsadmin -safemode get;hdfs fsck / 查看 Under-replicated/Missing/Corrupt |
先恢复副本与均衡,再退出:hdfs dfsadmin -setBalancerBandwidth 104857600 → hdfs balancer -threshold 5 → hdfs dfsadmin -safemode leave;若文件已损坏且可丢弃:hdfs fsck / -delete |
| 端口被占用(如 9870/50070) |
**netstat -tlpn |
grep 9870** |
| WARN util.NativeCodeLoader: Unable to load native-hadoop library |
检查 HADOOP_HOME/lib/native 是否存在且与 glibc/Hadoop 版本匹配 |
在 ~/.bashrc 或 hadoop-env.sh 设置 JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native 并 source ~/.bashrc;若仍不匹配,可忽略该警告(功能可用) |
以上条目对应 Ubuntu 环境下高频 HDFS 故障的成因与处置要点,包含 DataNode 缺失、连接拒绝、权限问题、安全模式、端口占用与本地库加载警告 等场景。
三、配置与环境的要点检查
- JAVA_HOME 必须写绝对路径:在 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 中将 export JAVA_HOME=${JAVA_HOME} 改为实际路径(如 /usr/lib/jvm/default-java),否则进程可能启动失败或异常退出。
- 主机名与地址一致性:确保 core-site.xml 的 fs.defaultFS 与 /etc/hosts 中的主机名映射一致;避免将主机名绑定到 127.0.0.1,否则外部无法访问 9000 端口。
- SSH 免密与解析:伪分布式/集群需配置 SSH 免密登录;若启动时报 ssh: Could not resolve hostname,在 ~/.bashrc 中设置 HADOOP_HOME 等环境变量,确保解析正常。
- 防火墙与监听地址:必要时关闭防火墙 sudo ufw disable;确认监听地址为 0.0.0.0 而非仅 127.0.0.1,否则仅本机能访问。
四、数据安全与回退建议
- 慎用 hdfs namenode -format:该操作会生成新的 clusterID,导致与现有 DataNode 不一致从而无法注册;若已执行并出现 DataNode 消失,需统一 clusterID 或(会清空数据)清理数据目录后重做格式化。
- 安全模式下的删除操作:hdfs fsck / -delete 会删除损坏文件,务必先评估影响并做好备份;优先尝试修复副本与均衡,再考虑删除。