创建 SparkSession 时如何修复 java.lang.InknownClassChangeError?

问题描述 投票:0回答:1

在 IntelliJ 中运行项目时遇到此错误:

"C:\Program Files\Java\jdk1.8.0_212\bin\java.exe" ...
Connected to the target VM, address: '127.0.0.1:57229', transport: 'socket'
Exception in thread "main" java.lang.IncompatibleClassChangeError: Implementing class
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:1106)
    at my.org.MyClass.<init>(MyClass.scala:2)

在 MyClass 中我只有:

import org.apache.spark.sql.SparkSession
SparkSession.builder().master("local[*]").appName("my app").getOrCreate()

这些是我在 pom.xml 中的版本(使用 Maven 和 IntelliJ):

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.12.0</version>
        </dependency>

我尝试在命令行中运行它,得到了相同的结果。

我已确认我的 java 版本是 64 位(Windows 11):

java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

还有什么我可以尝试的吗?

java windows scala apache-spark
1个回答
0
投票

这是由于(我猜)SparkSession 中传递的某些类的定义不一致/冲突造成的。在某一时刻,它被定义(或称为)为

class
。在其他地方,相同的 FQ 名称指的是
interface
。这可能在您的代码中,也可能在 Spark 代码中。不幸的是,异常消息并没有告诉我们定义不一致的类的名称。

我建议您确保在编译代码和运行代码时使用相同的 Spark JAR 文件。另外,请确保您没有混合不同版本的 Spark JAR。最后,请确保您已重新编译所有代码,特别是如果您最近更改了 Spark 版本。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.