Hadoop3.3.1执行start-all.sh后ResourceManager等组件启动失败,JDK16报模块访问错误
故障原因
Hadoop 3.3.1 官方仅兼容 JDK 8 和 JDK 11 两个版本,你当前使用的 JDK 16 版本过高。JDK 9 及后续版本引入了 Java 模块系统(JPMS),默认禁止外部程序通过反射访问 JDK 内部核心类的非公开方法,你日志中的报错就是因为 JDK 16 未开放 java.lang 包的反射权限给 Hadoop 的未命名模块,直接导致 ResourceManager、DataNode 等组件启动失败。
解决方案
方案一:降级JDK到兼容版本(推荐)
该方案可以完全规避版本适配问题,避免后续出现其他未知兼容性故障:
- 卸载当前 JDK 16,安装 Oracle JDK 8 或 OpenJDK 11(长期支持版本,稳定性最高)
- 分别更新系统全局
JAVA_HOME环境变量,以及 Hadoop 安装目录下etc/hadoop/hadoop-env.sh中的JAVA_HOME配置为新安装的 JDK 路径 - 执行
stop-all.sh停止所有残留的 Hadoop 进程,重新执行start-all.sh启动集群即可
方案二:保留JDK 16,手动添加反射权限参数
如果暂时不想降级 JDK,可以通过添加 JVM 启动参数临时开放所需的反射权限:
- 编辑 Hadoop 安装目录下的
etc/hadoop/hadoop-env.sh文件,在文件末尾添加如下配置:
export HADOOP_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED" export YARN_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED"
- 编辑 Hadoop 安装目录下的
etc/hadoop/yarn-env.sh文件,在文件末尾添加如下配置:
export YARN_RESOURCEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED" export YARN_NODEMANAGER_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"
- 保存所有配置文件后,停止所有残留 Hadoop 进程,重新启动集群即可。
启动验证
集群启动完成后执行 jps 命令,确认输出中包含 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager 五个进程,再访问 http://localhost:8088/cluster 即可正常打开集群管理页面。
内容的提问来源于stack exchange,提问作者zirconium
相关产品推荐
相关产品推荐

