Spark程序运行抛出java.lang.IllegalAccessError错误如何解决?
Spark代码运行报错:IllegalAccessError 解决方案
问题代码
package RDD_Programing import org.apache.spark.sql.SparkSession object RDD_Programing { def main (args:Array[String]) : Unit = { val spark=SparkSession.builder().master(master = "local") .appName(name = "rdd programing").getOrCreate() val sc=spark.sparkContext sc.setLogLevel("OFF") val input_path="input/readme/txt" val output_path="" val rdd1= sc.textFile(input_path) val rdd2= rdd1.flatMap(_.split("")) val rdd3= rdd2.map(x=>(x,x.length)) val rdd4= rdd3.filter{case (x,y) => y >=6} rdd4.collect().foreach(f=>{ println(f) }) } }
报错信息
Exception in thread "main" java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x4c2bb6e0) 无法访问类 sun.nio.ch.DirectBuffer (in module java.base),因为模块 java.base 未将 sun.nio.ch 导出到未命名模块 @0x4c2bb6e0 at org.apache.spark.storage.StorageUtils$.<init>(StorageUtils.scala:213) at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala) at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:114) at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:353) at org.apache.spark.SparkEnv$.registerOrLookupEndpoint$1(SparkEnv.scala:290) at org.apache.spark.SparkEnv$.create(SparkEnv.scala:339) at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:194) at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:279) at org.apache.spark.SparkContext.<init>(SparkContext.scala:464) at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2704) at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:953) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:947) at RDD_Programing.RDD_Programing$.main(RDD_Programing.scala:8) at RDD_Programing.RDD_Programing.main(RDD_Programing.scala)
解决方法
- 切换到Java 8环境:Spark早期版本(如2.x、3.0.x)对Java 9+的模块化支持不完善,Java 8是Spark官方推荐的兼容版本,切换后可直接解决该权限问题。
- 保留Java 9+并添加JVM参数:在程序启动时添加JVM参数,开放sun.nio.ch包的访问权限
- IDEA运行:在Run Configuration的VM Options中加入
--add-exports java.base/sun.nio.ch=ALL-UNNAMED - SBT构建:在build.sbt中配置
javaOptions += "--add-exports java.base/sun.nio.ch=ALL-UNNAMED" - Maven构建:在pom.xml的maven-compiler-plugin或maven-surefire-plugin中添加相应JVM参数
- IDEA运行:在Run Configuration的VM Options中加入
- 升级Spark版本:将Spark升级到3.1及以上版本,这些版本已经适配了Java 9+的模块化机制,无需额外配置即可解决该问题。
内容的提问来源于stack exchange,提问作者Muhammad Faishal A
相关产品推荐
相关产品推荐

