Apache Spark 3.3.0在Java 17上中断,并显示“无法访问类sun.nio.ch.DirectBuffer”

wfsdck30  于 2022-10-30  发布在  Java
关注(0)|答案(4)|浏览(1302)

Running unit tests with Spark 3.3.0 on Java 17 fails with IllegalAccessError: class StorageUtils cannot access class sun.nio.ch.DirectBuffer上也提出了类似的问题,但那个问题(和解决方案)只是关于单元测试的。对我来说,Spark实际运行程序时正在崩溃。
根据Spark overview,Spark可以与Java 17一起工作。我在Windows 10上使用Temurin-17.0.4+8(构建版本17.0.4+8),包括Maven中的Spark 3.3.0,如下所示:

<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>

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

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);

到处都是:

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)

Spark显然在做Java 17中不应该做的事情。
真令人失望,我该怎么办?

eivgtgni

eivgtgni1#

溶液

Running unit tests with Spark 3.3.0 on Java 17 fails with IllegalAccessError: class StorageUtils cannot access class sun.nio.ch.DirectBuffer上也提出了类似的问题,但那个问题(和解决方案)只是关于单元测试的。对我来说,Spark实际运行程序时正在崩溃。
请考虑添加适当的Java虚拟机命令行选项。
添加它们的确切方法取决于您运行程序的方式:通过使用命令行、IDE等。
示例
命令行选项取自JavaModuleOptions类:是的。

命令行

例如,要使用命令行运行程序(.jar文件),请执行以下操作:

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>

集成开发环境:智能J IDEA

参考文献:

参考文献

ghhaqwfi

ghhaqwfi2#

以下步骤帮助我解决了该问题。
如果您从**IDE(intelliJ IDEA)**运行应用程序,请遵循以下说明。
添加JVM选项“--添加-导出java.base/sun.nio.ch=ALL-UNNAMED”

3zwjbxry

3zwjbxry3#

您可以使用JDK 8。您可能真的应该使用。
但是如果你不能的话,你可以试着把这些java选项添加到你的build.sbt文件中。对我来说,它们是测试所需要的,所以我把它们放到:

val projectSettings = Seq(
...
  Test / javaOptions ++= Seq(
    "base/java.lang", "base/java.lang.invoke", "base/java.lang.reflect", "base/java.io", "base/java.net", "base/java.nio",
    "base/java.util", "base/java.util.concurrent", "base/java.util.concurrent.atomic",
    "base/sun.nio.ch", "base/sun.nio.cs", "base/sun.security.action",
    "base/sun.util.calendar", "security.jgss/sun.security.krb5",
  ).map("--add-opens=java." + _ + "=ALL-UNNAMED"),
...
hrysbysz

hrysbysz4#

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

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.16</version>
</dependency>

,然后加入命令列参数。如果您使用VS程式码,请加入

"vmArgs": "--add-exports java.base/sun.nio.ch=ALL-UNNAMED"

在项目.vscode文件夹下settings.json文件配置部分中

相关问题