为了使用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配置apachespark日志
我尝试过使用first using(运行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”
但是,由于我将uberjar传递给spark submit local(在amazonemr集群上),所以我真的不能指定一个将在我的机器上本地的库文件位置。既然uberjar包含了这些文件,那么它有没有办法使用这些文件呢?当spark应用程序最终从那里运行时,我是否被迫将这些库复制到emr集群上的主/节点?
不过,使用userclasspathfirst的第一种方法似乎是最好的方法。
1条答案
按热度按时间b1payxdu1#
因此,我解决了这个问题,并有几个问题正在进行。
因此,为了让spark允许logback工作,对我有效的解决方案是将我上面发布的文章中的项目组合起来,另外还有一个cert文件问题。
我用来传递到spark submit的证书文件不完整,并且覆盖了基本信任库证书。这导致向loggly发送https消息时出现问题。
第1部分更改:将maven更新为shade org.slf4j(如@matemaciek的回答所述)
第1a部分:logback.xml
第二部分变化:主类
第3部分变更:
我正在提交spark申请(例如):
因此,上面的spark submit在https认证问题上失败(当时正在联系loggly将消息发送到loggly服务),因为rds-truststore.jks重写了证书,而没有所有证书。我把它改成使用cacerts商店,现在它有了它所需要的所有证书。
发送此邮件时,日志部分不再出错