为了使用 Logback,我无法让我的 Spark 应用程序忽略 Log4j。我尝试使用 logback 的原因之一是它支持的 loggly appender。
我的 pom 文件中有以下依赖项和排除项。(版本在我的主 pom 库中的依赖管理器中。)
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-loggly</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
我参考了这两篇文章:
将 Logback 中的应用程序日志与 log4j 中的 Spark 日志分离
使用 Scala 和 logback 配置 Apache Spark 日志记录
我试过使用第一次使用(运行 spark-submit 时):
--conf "spark.driver.userClassPathFirst=true"
--conf "spark.executor.userClassPathFirst=true"
但收到错误
Exception in thread "main" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.ge
tLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/spark/util/ChildFirstURLClassLoader) of the current cl
ass, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/slf4
j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
我想让它与上面一起工作,但后来我也尝试了下面的
--conf "spark.driver.extraClassPath=$libs"
--conf "spark.executor.extraClassPath=$libs"
但由于我正在传递我的 uber jar 以在本地和(在 Amazon EMR 集群上)提交火花,所以我真的不能指定将在我的机器本地的库文件位置。由于 uber jar 包含文件,有没有办法使用这些文件?当 spark 应用程序最终从那里运行时,我是否被迫将这些库复制到 EMR 集群上的主节点/节点?
不过,关于使用 userClassPathFirst 的第一种方法似乎是最好的方法。