在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,如下所示:
<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)
星星之火显然是在做Java 17中不应该做的事情。
令人失望。我怎么才能避开这一切?
发布于 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
文件):
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创意
参考文献:
参考文献
- [The answer](https://stackoverflow.com/a/72724817).
- [Re: [Java 17] --add-exports required?-Apache Mail Archives](https://lists.apache.org/thread/814cpb1rpp73zkhtv9t4mkzzrznl82yn).
发布于 2022-09-28 06:20:52
以下步骤帮助我解开了这个问题的障碍。
如果您是从IDE (intelliJ IDEA)运行应用程序,请按照以下说明操作。
添加JVM选项“--添加-导出java.base/sun.nio.ch=ALL-UNNAMED”
发布于 2022-10-25 15:27:32
将此添加为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"
在项目中launch.json
文件的.vscode
文件夹下的configurations部分中。
https://stackoverflow.com/questions/73465937
复制相似问题