java.lang.ClassCastException:org.apache.logging.log4j.simple.SimpleLogger 与 org.apache.logging.log4j.core.Logger 不兼容

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

我有一个 Intelliji Scala 项目(Spark 3.3.2)。我正在组装一个胖罐子。

1.我可以构建 fat jar 并在本地从命令行运行它,没有问题。 2.Jar 包含要作为 UDF 的一部分在数据库上调用的代码 3.jar在数据库服务器上运行正常

然而,当我尝试运行 UDF 时,它返回以下错误。

java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLogger incompatible with org.apache.logging.log4j.core.Logger
    at org.apache.spark.internal.Logging.initializeLogging(Logging.scala:130)
    at org.apache.spark.internal.Logging.initializeLogIfNecessary(Logging.scala:115)
    at org.apache.spark.internal.Logging.initializeLogIfNecessary$(Logging.scala:109)
    at org.apache.spark.SparkContext.initializeLogIfNecessary(SparkContext.scala:84)
    at org.apache.spark.internal.Logging.initializeLogIfNecessary(Logging.scala:106)
    at org.apache.spark.internal.Logging.initializeLogIfNecessary$(Logging.scala:105)
    at org.apache.spark.SparkContext.initializeLogIfNecessary(SparkContext.scala:84)
    at org.apache.spark.internal.Logging.log(Logging.scala:53)
    at org.apache.spark.internal.Logging.log$(Logging.scala:51)
    at org.apache.spark.SparkContext.log(SparkContext.scala:84)
    at org.apache.spark.internal.Logging.logInfo(Logging.scala:61)
    at org.apache.spark.internal.Logging.logInfo$(Logging.scala:60)
    at org.apache.spark.SparkContext.logInfo(SparkContext.scala:84)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:195)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2714)
    at org.apache.spark.sql.SparkSession$Builder.$anonfun$getOrCreate$2(SparkSession.scala:953)
    at org.apache.spark.sql.SparkSession$Builder$$Lambda$111.000000007C7BCFC0.apply(Unknown Source)
    at scala.Option.getOrElse(Option.scala:201)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:947)
    at ParquetReader$.main(ParquetReader.scala:21)
    at ParquetReader.main(ParquetReader.scala)

发生这种情况是因为 spark.internal.logging.initializeLogging 出于某种原因在作为 UDF 的一部分被调用时初始化了一个不同的日志记录类(

org.apache.logging.log4j.simple.SimpleLogger
),而不是在本地运行它时。

  1. 在这种情况下,我可以直接控制 Spark 用作记录器的实际类吗?如果可以,如何控制?
  2. 我能否使用此设置在运行时完全禁用日志记录,最好使用我构建到 jar 中的配置文件?我已经尝试这样做了,但它总是默认为
    /org/apache/hadoop/log4j-default.properties
scala apache-spark intellij-idea log4j
1个回答
0
投票

您使用/打包的是什么版本的 log4j?它应该与 Spark 已经提供的相同,即 2.17.2 for Spark 3.3.2.

编辑:或者您可能必须从您的胖罐子中排除 log4j 依赖项以避免冲突。

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