当前位置: 首页 > 知识库问答 >
问题:

如何在执行org.apache.spark.sql.DataSet.collectAsList()时修复不支持的类文件主版本55

督飞羽
2023-03-14

我正在创建一个Java RESTAPI Spring Boot应用程序,它使用spark从服务器获取一些数据。当我尝试从数据集转换为列表时,它失败了。

我尝试了jdk8和jdk11编译和执行代码,但我得到了相同的'java.lang.IllegalArgumentException:不支持的类文件主要版本55',在过去,我通过更新Java版本解决了这个问题,但它不为此工作。

我正在使用:

>

  • JDK 11.0.2

    Spring防尘套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();
    

    查询是有效的,实际上在调试时,您可以在结果数据帧和事件数据集中看到信息。

    我希望输出是一个适当的事件列表,但我得到了一个例外:

    [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更改为aim Java 8:

    <java.version>1.8</java.version>
    

    然后更新项目,maven清理,maven安装然后运行。得到相同的版本55错误

  • 共有3个答案

    白翰海
    2023-03-14

    由于大多数python开发人员都为项目生成了virutalenv,因此您可以使用下面的代码片段来检查pyspark工作所需的不同组件的版本。错误原因是java版本不兼容<代码>pyspark期望java版本1.8,而不是jdk-11<代码>主要版本55对应于jdk-11,如下所示

    仅检查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
    
    方航
    2023-03-14

    问题的根本原因是一个符号链接,我瞄准了错误的JDK,这就是为什么它不起作用。JAVA\u HOME的目标是jdk11,eclipse正是以此为基础运行的。

    韦宏朗
    2023-03-14

    从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>
    
     类似资料:
    • 我有一个maven项目。它是用Java 16编写的。我安装了Java 16 JDK。 当我用dockerfile构建它时,一切都正常,但当我运行docker并转到我的项目url时,我得到了一个“不受支持的类文件主版本60”。 可以在tomcat或其他东西上运行java 16项目吗? 这是我的一些文件: DockerFile文件: 还有我的pom。xml: Tomcat日志: docker执行后从a

    • 我在Ubuntu上有一个Gradle项目。它是用Java 14编写的。我安装了Java 14 JDK。当我从命令行构建它时,一切都正常,但没有人想使用命令行!当我在IntelliJ IDEA中打开它时,它会抛出一个错误: 接下来是一个冗长、无用的堆栈跟踪,其中包含很多关于Groovy的信息。(该项目不是Groovy项目;这是一个Java项目。) 主要版本60指的是Java 16,本项目未使用该版本

    • 问题内容: 我有这个错误 如何解决? 我有这样的POM 项目有很多文字,因此需要Java 13。 问题答案: 在pom.xml中更改Spring引导版本可以为我解决此问题。

    • 当我构建我的应用程序时,我得到了以下错误。任何帮助都将不胜感激。 根:生成。格拉德尔 settings.gradle 应用程序:生成。格拉德尔 失败:生成失败,出现异常*其中:设置文件“/Users/Documents/android/MyApplication5/Settings。gradle“*出了什么问题:无法编译设置文件”//Users/anand/Documents/android/My

    • 我正在尝试运行一个颤振应用程序,在尝试时出现了这个错误,我所做的是我想在没有android studio的情况下运行颤振应用程序,所以我下载了android SDK和JDK 17,在我运行颤振医生后,它告诉我一切都很好,我尝试运行,它给了我这个错误: 所以我尝试了一个旧版本的JDK,它给了我另一个错误,所以我看到了使用JDK 17运行的第三个解决方案,那就是降级gradle中的gradle。属性,

    • 运行时遇到错误,我尝试了Pyspark error-Unsupported class file major version 55和Pyspark.topandas():'Unsupported class file major version 55'中提到的解决方案,但没有成功。 完整错误日志: