我在本地IDEA编写java spark时遇到以下报错信息:

Exception in thread "main" java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x37f1104d) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x37f1104d
    at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala:213)
    at org.apache.spark.storage.BlockManagerMasterEndpoint.<init>(BlockManagerMasterEndpoint.scala:121)
    at org.apache.spark.SparkEnv$.$anonfun$create$9(SparkEnv.scala:358)
    at org.apache.spark.SparkEnv$.registerOrLookupEndpoint$1(SparkEnv.scala:295)
    at org.apache.spark.SparkEnv$.create(SparkEnv.scala:344)
    at org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:196)
    at org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:284)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:483)
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58)
    at org.example.spark01_read_memeroy.main(spark01_read_memeroy.java:16)

其中spark-core为3.5.0,而java版本为18,错误信息简单翻译一下是因为 class org.apache.spark.storage.StorageUtils不能访问class sun.nio.ch.DirectBuffer(在模块java.base中),因为模块java.base没有将 sun.nio.ch 包导出给你正在使用的未命名模块 (unnamed module @0x37f1104d)。

什么是模块java.base?

这是 Java 的基础模块,包含所有 Java 核心类,默认所有 Java 程序都会依赖这个模块。

为什么不能将 sun.nio.ch 包导出使用?

因为在 Java 9 及更高版本中,Java 引入了模块系统,限制了对某些内部 API(如 sun.nio.ch)的访问,而sun.nio.ch包含 Java 的内部 I/O 实现和底层网络处理代码,属于 JDK 内部 API,不在公共 API 范围内。此包仅供 Java 内部使用,不允许外部代码直接访问。

总的来说sun.nio.ch 是 Java 内部的一个包,Java 18 以上版本对其访问权限做了限制,默认情况下外部代码(包括 Spark)无法访问这个包中的类

怎么解决?

添加VM options:

--add-exports java.base/sun.nio.ch=ALL-UNNAMED
作用是将 java.base 模块中的 sun.nio.ch 包“导出”到未命名模块,

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐