【问题标题】:How to fix 'Unsupported class file major version 55' while executing 'org.apache.spark.sql.DataSet.collectAsList()'如何在执行“org.apache.spark.sql.DataSet.collectAsList()”时修复“不支持的类文件主要版本 55”
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这是救世主。 ?
  • 这解决了我的问题。@ManoshP 你是如何得出这个结论来删除这个工件并添加最新版本的。
  • 这个解决方案解决了我的问题。谢谢你:)
【解决方案2】:

问题的根本原因是我瞄准了错误的 JDK 的符号链接,这就是它不起作用的原因。 JAVA_HOME 的目标是 jdk11,而 eclipse 正在使用它运行。

【讨论】:

  • 这是我的 gradle jvm 版本设置
【解决方案3】:

由于大多数python 开发人员为该项目生成了virutalenv,您可以使用下面的sn-p 检查pyspark 工作所需的不同组件的版本。错误的原因是java版本不兼容。 pyspark 期望 java version 1.8+ 而不是 jdk-11Major 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

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2019-03-23
    • 2021-11-25
    • 2021-07-08
    • 2021-05-09
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多