【发布时间】:2019-09-19 07:01:57
【问题描述】:
我正在创建一个 Java RESTAPI Spring Boot 应用程序,它使用 spark 从服务器获取一些数据。当我尝试从 Dataset 转换为 List 时,它失败了。
我尝试使用 jdk8 和 jdk11 来编译和执行代码,但我得到相同的 'java.lang.IllegalArgumentException: Unsupported class file major version 55',过去,我通过更新 Java 版本解决了这个问题,但它不适用于此。
我正在使用:
JDK 11.0.2
Spring Boot 2.1.4
Spark 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 clean,maven install 然后运行。 得到相同的版本 55 错误
【问题讨论】:
-
这表明 Apache XBean 使用的 ASM 版本(参见堆栈跟踪)不支持 Java 11。
-
它也不适用于 Java 8,而且我在堆栈跟踪中看不到任何东西......另一个奇怪的事情是它只发生在某些方法上,而不是全部
-
要在 Java 8 上运行,您需要使用 Java 8 或至少以 Java 8 为目标进行编译。
-
我已经用 java8 试过了,还是不行
-
如果您使用 Java 8,那么它就不会再说“版本 55”了,那么您能描述一下您是如何“尝试”使用它的吗?
标签: java spring-boot apache-spark