薰衣草 发表于 2024-6-8 11:21:19

java-19的对mapreduce限制访问的反射对象

Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @4ba2ca36

java-19版本对MAPreduce的运行不兼容, 报错ClassLoader.defineClass 方法由于Java模块系统的限制而不可用,限制了对某些内部API的访问。,在Hadoop的cmd文件里添加了 @rem Extra Java runtime options.Empty by default.
@rem set HADOOP_OPTS=%HADOOP_OPTS% -Djava.net.preferIPv4Stack=trueset HADOOP_OPTS=%HADOOP_OPTS% --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMEDset HADOOP_OPTS=%HADOOP_OPTS% --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED这个之后还是报错

到底应该怎么办啊,在线等,急

admin 发表于 2024-6-14 08:41:51

Java 9 引入了模块系统(JPMS),对内部 API 的访问进行了更严格的限制。你提到的错误是由于你的程序尝试访问受保护的内部 API 引起的。在使用 Java 19 运行 Hadoop 时遇到的 InaccessibleObjectException 错误表明你试图访问 ClassLoader.defineClass 方法,而这个方法被 Java 模块系统限制访问。

你已经尝试在 Hadoop 的 cmd 文件中添加了一些 JVM 参数(如 --add-opens),但仍然遇到错误。这可能是由于参数设置的位置或方式不正确,或者有其他未覆盖的模块需要打开。


解决方案步骤:
确保 JVM 参数正确设置:
确保你在正确的位置添加了 JVM 参数,并且没有拼写错误。应该在启动 Hadoop 的命令脚本中添加这些参数。
set HADOOP_OPTS=%HADOOP_OPTS% --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED

确认参数位置:
确保参数添加在正确的位置。如果参数在脚本中的位置不对,可能无法正确传递给 JVM。

其他可能需要的模块:
确认是否有其他模块需要打开。可以尝试添加更多的 --add-opens 参数。

配置文件设置:
也可以将这些 JVM 参数添加到 Hadoop 配置文件中,比如 hadoop-env.sh(对于 Linux 系统)或 hadoop-env.cmd(对于 Windows 系统)。

在 hadoop-env.sh 中:
export HADOOP_OPTS="$HADOOP_OPTS --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED"

在 hadoop-env.cmd 中:
set HADOOP_OPTS=%HADOOP_OPTS% --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED

确认配置生效:
启动 Hadoop 时,可以通过查看日志或在命令行中打印 HADOOP_OPTS 变量来确认参数是否生效。

检查 Hadoop 版本:
如果以上方法均无效,可能是 Hadoop 版本与 Java 19 存在不兼容。考虑使用较新的 Hadoop 版本,或回退到 Java 8 或 Java 11 版本。

示例:确认参数生效
可以在启动 Hadoop 的脚本中添加以下命令来确认 HADOOP_OPTS 是否正确设置:
echo %HADOOP_OPTS%

最终检查
如果以上步骤仍未解决问题,建议详细检查错误日志,确认具体是哪一个模块或类导致的问题。这样可以更有针对性地添加 --add-opens 参数。

希望这些步骤能帮助你解决问题!如果还有疑问,请随时反馈详细的错误信息。


页: [1]
查看完整版本: java-19的对mapreduce限制访问的反射对象