未安装Spark运行简单应用时遇InaccessibleObjectException错误求助
Spark应用启动报错解决方案
问题背景
学习Spark时尝试在未安装Spark的环境下运行输出DataFrame前5行的简单应用,启动时报错,已尝试Snowflake相关方案、StackOverflow方法及重装Java,均未解决。
环境信息
- IDE:Eclipse IDE for Enterprise Java and Web Developers(含孵化组件),版本2022-09 (4.25.0),构建ID 20220908-1902
- Java版本:openjdk version "11.0.12" 2021-07-20,OpenJDK Runtime Environment Microsoft-25199 (build 11.0.12+7),OpenJDK 64-Bit Server VM Microsoft-25199 (build 11.0.12+7, mixed mode)
错误日志
Exception in thread "main" java.lang.ExceptionInInitializerError at org.apache.spark.unsafe.array.ByteArrayMethods.<clinit>(ByteArrayMethods.java:54) at org.apache.spark.internal.config.package$.<init>(package.scala:1095) at org.apache.spark.internal.config.package$.<clinit>(package.scala) at org.apache.spark.SparkConf$.<init>(SparkConf.scala:654) at org.apache.spark.SparkConf$.<clinit>(SparkConf.scala) at org.apache.spark.SparkConf.set(SparkConf.scala:94) at org.apache.spark.SparkConf.set(SparkConf.scala:83) at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$1(SparkSession.scala:916) at scala.collection.mutable.HashMap.$anonfun$foreach$1(HashMap.scala:149) at scala.collection.mutable.HashTable.foreachEntry(HashTable.scala:237) at scala.collection.mutable.HashTable.foreachEntry$(HashTable.scala:230) at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:44) at scala.collection.mutable.HashMap.foreach(HashMap.scala:149) at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:916) at net.jgp.books.spark.ch01.lab100_csv_to_dataframe.CsvToDataframeApp.start(CsvToDataframeApp.java:32) at net.jgp.books.spark.ch01.lab100_csv_to_dataframe.CsvToDataframeApp.main(CsvToDataframeApp.java:21) Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make private java.nio.DirectByteBuffer(long,int) accessible: module java.base does not "opens java.nio" to unnamed module @35dab4eb at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) at java.base/java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:188) at java.base/java.lang.reflect.Constructor.setAccessible(Constructor.java:181) at org.apache.spark.unsafe.Platform.<clinit>(Platform.java:56) ... 16 more
解决方案
核心原因
Java 9及以上引入的模块系统限制了反射访问权限,Spark代码运行在未命名模块中,而java.base模块未将java.nio包开放给未命名模块,导致反射调用失败。
具体解决步骤
添加JVM启动参数
在运行应用时,给JVM添加以下参数以开放模块访问权限:--add-opens java.base/java.nio=ALL-UNNAMED在Eclipse中配置参数
- 右键项目 → 选择
Run As→Run Configurations - 在弹出窗口中找到你的Java应用配置,切换到
Arguments标签页 - 在
VM arguments输入框中添加上述参数 - 点击
Apply保存配置后重新运行应用
- 右键项目 → 选择
额外检查项
- 确认Spark版本与Java版本兼容:Spark 3.0及以上支持Java 11,建议使用Spark 3.1+版本
- 检查项目依赖:确保
spark-core、spark-sql等依赖的scope为compile(而非provided),因为未安装Spark环境,需要将依赖打包到应用中
内容的提问来源于stack exchange,提问作者perseverance
相关产品推荐
相关产品推荐

