Hadoop 在 Ubuntu 上的故障排除方法
一 快速定位与通用检查
二 常见故障与修复对照表
| 症状 | 高频原因 | 快速修复 |
|---|---|---|
| 启动报 JAVA_HOME is not set | 未设置或设置路径错误 | 在 hadoop-env.sh 中显式导出 JAVA_HOME,如:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 |
| 以 root 启动报缺少 *_USER 变量 | Hadoop 3.x 的安全启动限制 | 在 sbin/start-dfs.sh / stop-dfs.sh 顶部加入:HDFS_DATANODE_USER=root;HDFS_DATANODE_SECURE_USER=hdfs;HDFS_NAMENODE_USER=root;HDFS_SECONDARYNAMENODE_USER=root |
| 执行脚本报 pdsh@xxx: localhost: Connection refused | pdsh 默认用 rsh | 在 /etc/profile 加入:export PDSH_RCMD_TYPE=ssh 并 source 使其生效 |
| 浏览器访问 50070 失败 | Hadoop 3.x 端口变更 | 改用 9870(如 http://localhost:9870) |
| DataNode 启动失败或反复退出 | 切换伪分布式/分布式后 tmp/dfs/name/data 不一致 | 清理所有节点的临时目录,重新 hdfs namenode -format 后再启动 |
| HDFS 命令报 No such file or directory | 用户 HDFS 家目录 不存在 | 先执行:hdfs dfs -mkdir -p /user/$USER |
| 命令未找到或 PATH 无效 | 仅当前终端导出 PATH | 在 ~/.bashrc 中追加 PATH 并 source,确保全局可用 |
| 主机名解析错误(如 “Does not contain a valid host:port authority”) | /etc/hosts 或主机名含非法字符(如 _ 或 .) | 使用仅含字母数字与连字符的主机名,并在 /etc/hosts 正确映射 |
| 端口不通或 Live datanodes 为 0 | 防火墙阻断或节点间不通 | 放行相关端口(如 9870/8088/9000/50010/50020/50075/50090),或临时关闭 ufw 验证 |
| 出现 NativeCodeLoader 警告 | 缺少本地库或库路径未设置 | 在 hadoop-env.sh 添加:export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native;export HADOOP_OPTS=“-Djava.library.path=$HADOOP_PREFIX/lib” |
三 配置与版本差异要点
四 实用排障脚本与命令清单
#!/usr/bin/env bash
echo "=== Java & Hadoop ==="
java -version 2>&1
hadoop version 2>&1
echo "=== Env ==="
echo "JAVA_HOME=$JAVA_HOME"
echo "HADOOP_HOME=$HADOOP_HOME"
echo "PATH=$PATH"
echo "=== Processes ==="
jps
echo "=== NameNode HTTP ==="
ss -lntp | grep 9870 || echo "9870 not listening"
echo "=== DFS Health ==="
hdfs dfsadmin -report | head -20
echo "=== Recent logs (NameNode) ==="
tail -n50 $HADOOP_HOME/logs/hadoop-*-namenode-*.log | grep -i -E 'error|exception|failed'