我正在创建一个Java RESTAPI Spring Boot应用程序,该应用程序使用spark从服务器获取一些数据。当我尝试从数据集转换为列表时,它会失败。
我尝试用jdk8和jdk11编译和执行代码,但是得到了相同的'java.lang.IllegalArgumentException:不支持的类文件主要版本55',过去,我已经通过更新Java版本解决了这个问题。 ,但此操作无效。
我正在使用:
JDK 11.0.2
Spring Boot 2.1.4
火花2.4.2
这是我正在执行的代码:
Dataset<Row> dataFrame = sparkSession.read().json("/home/data/*.json");
dataFrame.createOrReplaceTempView("events");
Dataset<Row> resultDataFrame = sparkSession.sql("SELECT * FROM events WHERE " + predicate);
Dataset<Event> eventDataSet = resultDataFrame.as(Encoders.bean(Event.class));
return eventDataSet.collectAsList();
查询有效,实际上在调试时,您可以在resultDataFrame和eventDataSet中看到信息。
我希望输出是正确的事件列表,但我遇到了异常:
[http-nio-8080-exec-2] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 55] with root cause
java.lang.IllegalArgumentException: Unsupported class file major version 55
at org.apache.xbean.asm6.ClassReader.<init>(ClassReader.java:166)
at org.apache.xbean.asm6.ClassReader.<init>(ClassReader.java:148)
at org.apache.xbean.asm6.ClassReader.<init>(ClassReader.java:136)
at org.apache.xbean.asm6.ClassReader.<init>(ClassReader.java:237)
at org.apache.spark.util.ClosureCleaner$.getClassReader(ClosureCleaner.scala:49)
at org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:517)
at org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:500)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
at scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:134)
at scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:134)
at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:236)
at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
at scala.collection.mutable.HashMap$$anon$1.foreach(HashMap.scala:134)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
at org.apache.spark.util.FieldAccessFinder$$anon$3.visitMethodInsn(ClosureCleaner.scala:500)
.....
评论更新: 对于Java 8,我将pom更改为针对Java 8:
<java.version>1.8</java.version>
然后更新项目,清理Maven,安装Maven然后运行。 出现相同版本55错误
答案 0 :(得分:2)
从spark-core依赖关系中排除默认的XBean工件,并添加最新版本的XBean工件,它对我有用。
<dependencies>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-asm6-shaded</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-asm6-shaded</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
答案 1 :(得分:1)
由于大多数python
开发人员都为该项目提供了virutalenv,因此您可以使用以下代码段来检查pyspark
正常运行所需的不同组件的版本。该错误的原因是不兼容的Java版本。 pyspark
期望java version 1.8+
而不是jdk-11
。如您所见,Major version 55
与jdk-11
相对应here
仅检查Spark官方文档的版本兼容性。
import subprocess
# subprocess to find the java , scala and python version
cmd1 = "java -version"
cmd2 = "scala -version"
cmd3 = "python --version"
cmd4 = "whoami"
arr = [cmd1, cmd2, cmd3, cmd4]
for cmd in arr:
process = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE,stderr=subprocess.PIPE )
stdout,stderr=process.communicate()
logging.info(stdout.decode("utf-8") + " | " + stderr.decode("utf-8"))
logging.info(os.getenv("JAVA_HOME"))
logging.info(os.getenv("HOME"))
您将获得以下输出:
INFO:root: | openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
INFO:root: | Scala code runner version 2.12.2 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
INFO:root:Python 3.6.9
INFO:root:training
答案 2 :(得分:0)
此问题的根本原因是符号链接,我瞄准的是错误的JDK,这就是为什么它不起作用的原因。 JAVA_HOME的目标是jdk11,而eclipse与此同时运行。