首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ApacheSpark3.3.0在Java 17上出现“无法访问类sun.nio.ch.DirectBuffer”

ApacheSpark3.3.0在Java 17上出现“无法访问类sun.nio.ch.DirectBuffer”
EN

Stack Overflow用户
提问于 2022-08-23 23:30:23
回答 4查看 4.1K关注 0票数 19

在Java17上使用Spark3.3.0运行单元测试IllegalAccessError失败:类StorageUtils不能访问类sun.nio.ch.DirectBuffer上也提出了类似的问题,但这个问题(和解决方案)仅仅是关于单元测试的。对我来说,星火是打破了实际运行程序。

根据火花概述,Spark与Java 17一起工作。我在Windows 10上使用Temurin17.0.4+8(构建17.0.4+8),包括Maven中的Spark3.3.0,如下所示:

代码语言:javascript
复制
<scala.version>2.13</scala.version>
<spark.version>3.3.0</spark.version>
...
<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_${scala.version}</artifactId>
  <version>${spark.version}</version>
</dependency>

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_${scala.version}</artifactId>
  <version>${spark.version}</version>
</dependency>

我尝试运行一个简单的程序:

代码语言:javascript
复制
final SparkSession spark = SparkSession.builder().appName("Foo Bar").master("local").getOrCreate();
final Dataset<Row> df = spark.read().format("csv").option("header", "false").load("/path/to/file.csv");
df.show(5);

这个地方到处都是:

代码语言:javascript
复制
Caused by: java.lang.IllegalAccessError: class org.apache.spark.storage.StorageUtils$ (in unnamed module @0x59d016c9) cannot access class sun.nio.ch.DirectBuffer (in module java.base) because module java.base does not export sun.nio.ch to unnamed module @0x59d016c9
    at org.apache.spark.storage.StorageUtils$.<clinit>(StorageUtils.scala:213)
    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:201)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:947)

星星之火显然是在做Java 17中不应该做的事情。

令人失望。我怎么才能避开这一切?

EN

回答 4

Stack Overflow用户

发布于 2022-08-26 16:42:17

解决方案

在Java17上使用Spark3.3.0运行单元测试IllegalAccessError失败:类StorageUtils不能访问类sun.nio.ch.DirectBuffer上也提出了类似的问题,但这个问题(和解决方案)仅仅是关于单元测试的。对我来说,星火是打破了实际运行程序。

请考虑添加适当的Java虚拟机命令行选项.

添加它们的确切方式取决于您如何运行程序:通过使用命令行、IDE等。

示例

命令行选项取自JavaModuleOptions类:v3.3.0 /JavaModuleOptions.java,v3.3.0·apache/spark

命令行

例如,要通过使用命令行运行程序( .jar文件):

代码语言:javascript
复制
java \
    --add-opens=java.base/java.lang=ALL-UNNAMED \
    --add-opens=java.base/java.lang.invoke=ALL-UNNAMED \
    --add-opens=java.base/java.lang.reflect=ALL-UNNAMED \
    --add-opens=java.base/java.io=ALL-UNNAMED \
    --add-opens=java.base/java.net=ALL-UNNAMED \
    --add-opens=java.base/java.nio=ALL-UNNAMED \
    --add-opens=java.base/java.util=ALL-UNNAMED \
    --add-opens=java.base/java.util.concurrent=ALL-UNNAMED \
    --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED \
    --add-opens=java.base/sun.nio.ch=ALL-UNNAMED \
    --add-opens=java.base/sun.nio.cs=ALL-UNNAMED \
    --add-opens=java.base/sun.security.action=ALL-UNNAMED \
    --add-opens=java.base/sun.util.calendar=ALL-UNNAMED \
    --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED \
    -jar <JAR_FILE_PATH>

艾德: IntelliJ创意

参考文献:

参考文献

代码语言:javascript
复制
- [The answer](https://stackoverflow.com/a/72724817).
代码语言:javascript
复制
    - [Re: [Java 17] --add-exports required?-Apache Mail Archives](https://lists.apache.org/thread/814cpb1rpp73zkhtv9t4mkzzrznl82yn).
票数 7
EN

Stack Overflow用户

发布于 2022-09-28 06:20:52

以下步骤帮助我解开了这个问题的障碍。

如果您是从IDE (intelliJ IDEA)运行应用程序,请按照以下说明操作。

添加JVM选项“--添加-导出java.base/sun.nio.ch=ALL-UNNAMED”

票数 6
EN

Stack Overflow用户

发布于 2022-10-25 15:27:32

将此添加为Pom.xml文件中的显式依赖项。不要更改3.0.16以外的版本

代码语言:javascript
复制
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.16</version>
</dependency>

然后添加命令行参数。如果使用VS代码,则添加

代码语言:javascript
复制
"vmArgs": "--add-exports java.base/sun.nio.ch=ALL-UNNAMED"

在项目中launch.json文件的.vscode文件夹下的configurations部分中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73465937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档