Hadoop 单机版 3 大常见报错排查:SSH、JAVA_HOME 与权限问题解决
Hadoop 单机版 3 大常见报错排查:SSH、JAVA_HOME 与权限问题解决
刚接触 Hadoop 的新手在搭建单机环境时,经常会遇到各种报错导致安装失败。本文将针对最常见的三类问题——SSH 连接失败、JAVA_HOME 未设置和权限不足导致服务启动失败,提供详细的排查思路和解决方案。通过分析错误日志、分步骤排错和已验证的修复命令,帮助初学者快速定位并解决问题。
1. SSH 连接失败问题排查
Hadoop 的各个组件需要通过 SSH 进行通信,因此 SSH 配置是否正确直接关系到 Hadoop 能否正常运行。以下是常见的 SSH 相关错误及解决方法。
1.1 错误现象与日志分析
当执行start-dfs.sh或start-yarn.sh时,如果遇到类似以下错误:
localhost: ssh: connect to host localhost port 22: Connection refused starting yarn daemons resourcemanager running as process XXXX. Stop it first.或者在日志文件中看到:
Permission denied (publickey,password).这通常表明 SSH 服务未正确安装或配置。
1.2 分步骤排错流程
检查 SSH 服务是否安装并运行:
sudo service ssh status如果未安装,使用以下命令安装:
sudo apt-get install openssh-server sudo service ssh start测试本地 SSH 连接:
ssh localhost如果提示输入密码,说明 SSH 已安装但未配置免密登录。
配置 SSH 免密登录:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys完成后再次测试
ssh localhost应该无需输入密码。检查防火墙设置:
sudo ufw status如果防火墙启用,确保 SSH 端口(默认22)是开放的:
sudo ufw allow 22
1.3 已验证的修复命令集合
| 问题描述 | 修复命令 |
|---|---|
| SSH 服务未安装 | sudo apt-get install openssh-server |
| 无法生成密钥 | rm -rf ~/.ssh/*后重新生成 |
| 权限问题 | chmod 700 ~/.ssh && chmod 600 ~/.ssh/* |
| 防火墙阻止 | sudo ufw allow 22或sudo systemctl stop firewalld |
提示:如果使用非标准 SSH 端口,需要在 Hadoop 配置文件中指定,修改
etc/hadoop/hadoop-env.sh添加export HADOOP_SSH_OPTS="-p 你的端口号"
2. JAVA_HOME 未设置问题排查
Hadoop 是基于 Java 开发的,因此正确配置 Java 环境是运行的前提条件。JAVA_HOME 未设置或设置错误是常见问题之一。
2.1 错误现象与日志分析
启动 Hadoop 时可能看到如下错误:
Error: JAVA_HOME is not set and could not be found.或者在日志中有类似记录:
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/hadoop/hdfs/server/namenode/NameNode : Unsupported major.minor version 52.0后者通常表示 Java 版本不兼容,Hadoop 3.x 需要 Java 8 或 11。
2.2 分步骤排错流程
确认 Java 是否安装:
java -version如果没有安装或版本不符,需要安装合适版本的 JDK:
sudo apt-get install openjdk-8-jdk查找 Java 安装路径:
sudo update-alternatives --config java记下路径,通常是
/usr/lib/jvm/java-8-openjdk-amd64这样的形式。设置 JAVA_HOME 环境变量: 编辑
~/.bashrc文件:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH然后使配置生效:
source ~/.bashrc验证 Hadoop 配置: 检查
etc/hadoop/hadoop-env.sh中是否有正确的 JAVA_HOME 设置:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
2.3 不同环境下的 Java 配置
| 环境 | 配置位置 | 示例 |
|---|---|---|
| 用户环境 | ~/.bashrc | export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 |
| 系统环境 | /etc/environment | JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" |
| Hadoop 配置 | etc/hadoop/hadoop-env.sh | export JAVA_HOME=${JAVA_HOME} |
注意:修改配置后都需要执行
source命令或重新登录使更改生效。如果使用 sudo 运行 Hadoop,系统环境变量可能不会被继承,此时需要在 hadoop-env.sh 中明确设置。
3. 权限不足导致服务启动失败
Hadoop 对文件和目录权限有严格要求,权限配置不当会导致各种服务启动失败。
3.1 错误现象与日志分析
常见错误包括:
mkdir: cannot create directory '/usr/local/hadoop/logs': Permission denied或者日志中出现:
org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /tmp/hadoop-root/dfs/name is in an inconsistent state: storage directory does not exist or is not accessible.3.2 分步骤排错流程
检查 Hadoop 安装目录权限:
sudo chown -R hadoop:hadoop /usr/local/hadoop sudo chmod -R 755 /usr/local/hadoop确保运行 Hadoop 的用户(通常是 hadoop)对安装目录有读写权限。
配置临时目录权限: 在
core-site.xml中指定的临时目录(如/usr/local/hadoop/tmp)需要正确权限:mkdir -p /usr/local/hadoop/tmp chown -R hadoop:hadoop /usr/local/hadoop/tmp chmod -R 755 /usr/local/hadoop/tmp处理 HDFS 目录权限:
hdfs namenode -format # 格式化前确保目录可写如果之前格式化失败,可能需要清理旧数据:
rm -rf /usr/local/hadoop/tmp/dfs/*解决 root 用户运行问题: Hadoop 3.x 默认不允许 root 用户运行,可以修改
sbin/start-dfs.sh和sbin/stop-dfs.sh,在开头添加:HDFS_DATANODE_USER=root HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
3.3 关键目录权限要求
| 目录 | 推荐权限 | 所属用户 |
|---|---|---|
| Hadoop 安装目录 | 755 | hadoop:hadoop |
| 临时目录 (hadoop.tmp.dir) | 755 | hadoop:hadoop |
| 日志目录 | 755 | hadoop:hadoop |
| HDFS 数据目录 | 700 | hadoop:hadoop |
提示:在生产环境中,建议创建专用 hadoop 用户来运行服务,避免使用 root 权限。可以通过以下命令创建用户:
sudo adduser hadoop sudo usermod -aG sudo hadoop
4. 综合排错与验证
当解决上述三类主要问题后,还需要进行综合验证确保 Hadoop 完全正常运行。
4.1 服务启动验证
格式化 HDFS(仅第一次需要):
hdfs namenode -format启动 HDFS:
start-dfs.sh启动 YARN:
start-yarn.sh检查进程:
jps应该看到至少有以下进程:
NameNode DataNode ResourceManager NodeManager SecondaryNameNode
4.2 Web UI 访问验证
| 服务 | 默认端口 | URL |
|---|---|---|
| NameNode | 9870 | http://localhost:9870 |
| ResourceManager | 8088 | http://localhost:8088 |
| HistoryServer | 19888 | http://localhost:19888 |
4.3 运行测试作业
运行 Hadoop 自带的 wordcount 示例:
hadoop fs -mkdir /input hadoop fs -put $HADOOP_HOME/etc/hadoop/*.xml /input hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /input /output hadoop fs -cat /output/*如果一切正常,应该能看到各个 XML 文件的单词统计结果。