Java 和 Spark 更新后的记录器类问题

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

我知道有关此异常的类似问题,但是没有一个解决我的问题。 我有一个java应用程序。最近我不得不从 Java 17 升级到 21,这导致 Apache Spark 也升级到 3.5.0。在升级之前,我的应用程序运行没有任何问题。完成所有升级后,当我运行我的应用程序时,出现以下异常:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:109)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Caused by: java.lang.ClassCastException: class org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to class org.apache.logging.log4j.core.LoggerContext (org.apache.logging.slf4j.SLF4JLoggerContext and org.apache.logging.log4j.core.LoggerContext are in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @20fa23c1)
        at org.apache.spark.util.Utils$.setLogLevel(Utils.scala:2318)
        at org.apache.spark.SparkContext.setLogLevel(SparkContext.scala:399)
        at org.apache.spark.api.java.JavaSparkContext.setLogLevel(JavaSparkContext.scala:673)
        at cz.cuni.matfyz.mminfer.wrappers.MongoDBSchemaLessWrapper.initiateContext(MongoDBSchemaLessWrapper.java:72)
        at cz.cuni.matfyz.mminfer.algorithms.rba.RecordBasedAlgorithm.process(RecordBasedAlgorithm.java:27)
        at cz.cuni.matfyz.mminfer.MMInferOneInAll.main(MMInferOneInAll.java:45)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        ... 5 more

这就是我运行应用程序的方式(命令行选项是为了确保 Spark 3.5.0 和 Java 21 的兼容性):

java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED  --add-opens=java.base/java.lang.reflect=ALL-UNNAMED  --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED -jar target/MM-Infer-One-In-All-1.0-SNAPSHOT.jar C:\Users\alzbe\Documents\mff_mgr\Diplomka\Apps\temp\checkpoint srutkova yelpbusinesssample

这是我的pom文件中各自的依赖关系:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.5.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.5.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.4.13</version>

        </dependency>
        <!--https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver--> 
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.12.10</version>
        </dependency>
        <!--https://mvnrepository.com/artifact/org.mongodb.spark/mongo-spark-connector--> 
        <dependency>
            <groupId>org.mongodb.spark</groupId>
            <artifactId>mongo-spark-connector_2.12</artifactId>
            <version>3.0.1</version>
            <scope>compile</scope>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.4.0</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>
    

我尝试切换到不同版本的 Spring Boot 并排除 slf4j/log4j。 (实际上排除 log4j 让我无法连接到我的 MongoDB)但是我所有的尝试都失败了。

有人对问题可能是什么有任何建议吗?

java mongodb apache-spark log4j slf4j
1个回答
0
投票

org.apache.logging.log4j.LoggerContext 来自 log4j-to-slf4j 2.7 org.apache.logging.log4j.core.LoggerContext 来自 log4j-to-slf4j 2.22

你的spring boot版本使用(强制)2.13,而spark似乎需要2.22。 因此,您可以尝试的一件事是强制使用 2.22(如果您不知道,请搜索如何做到这一点,并仔细检查依赖项任务是否属于这种情况),如果这不起作用,您需要升级 spring。 Spring 目前在任何版本中都不支持 2.22,但也许使用 spring 3 和强制 2.22 的解决方案可以工作(如果 spring 2 和强制 2.22 不支持)。否则,不幸的是,你无法使用最新的 Spark

© www.soinside.com 2019 - 2024. All rights reserved.