运行spark-submit命令报Java模块访问异常问题求助
问题原因分析
该报错的根本原因是Java版本与当前使用的Apache Spark版本的兼容性冲突:
- 从Java 9开始引入了JPMS(Java平台模块化系统),默认禁止了对JDK内部API的反射访问,你遇到的
java.lang.reflect.InaccessibleObjectException就是Spark的底层组件尝试通过反射访问java.nio包下的内部构造方法时,被Java的模块化安全机制拦截导致的。 - 你当前使用的Java版本为9及以上版本,而你安装的Spark版本没有配置对应的JVM适配参数,或者版本本身不支持高版本Java。
解决方案
方案1:更换适配的Java版本(最稳定,推荐)
绝大多数学习场景使用的Spark 2.x、Spark 3.0~3.2版本的官方推荐运行环境为Java 8,操作步骤:
- 下载并安装Oracle JDK 8 或者OpenJDK 8
- 修改系统环境变量
JAVA_HOME指向JDK 8的安装路径,将%JAVA_HOME%\bin添加到系统Path的最靠前位置 - 新开cmd窗口执行
java -version确认版本为1.8.x后,重新运行spark-submit ratings-counter.py即可
方案2:添加JVM启动参数适配高版本Java(适合不想更换Java版本的场景)
如果需要保留当前高版本Java,可在运行spark-submit时添加对应的JVM开放参数,命令如下:
spark-submit --conf "spark.driver.extraJavaOptions=--add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED" --conf "spark.executor.extraJavaOptions=--add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED" ratings-counter.py
如果后续运行还出现其他模块反射报错,可以继续追加对应的--add-opens参数即可。
如果想永久生效,可将上述两个配置参数添加到Spark安装目录下conf/spark-defaults.conf文件中,不需要每次运行都加参数。
内容的提问来源于stack exchange,提问作者collapseCorpse
相关产品推荐
相关产品推荐

