在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中不应该做的事情。
真令人失望,我该怎么办?
4条答案
按热度按时间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
文件),请执行以下操作:集成开发环境:智能J IDEA
参考文献:
参考文献
ghhaqwfi2#
以下步骤帮助我解决了该问题。
如果您从**IDE(intelliJ IDEA)**运行应用程序,请遵循以下说明。
添加JVM选项“--添加-导出java.base/sun.nio.ch=ALL-UNNAMED”
3zwjbxry3#
您可以使用JDK 8。您可能真的应该使用。
但是如果你不能的话,你可以试着把这些java选项添加到你的
build.sbt
文件中。对我来说,它们是测试所需要的,所以我把它们放到:hrysbysz4#
将此作为显式依赖项添加到Pom.xml文件中。不要更改3.0.16以外的版本
,然后加入命令列参数。如果您使用VS程式码,请加入
在项目
.vscode
文件夹下settings.json
文件配置部分中