У меня возникли проблемы с тем, чтобы приложение Spark игнорировало Log4j, чтобы использовать Logback. Одна из причин, по которой я пытаюсь использовать 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 от журналов Spark в log4j
Настройка ведения журнала Apache Spark с помощью Scala и вернуться
Я пробовал использовать первое использование (при запуске 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 содержит файлы, есть ли способ использовать эти файлы? Должен ли я копировать эти библиотеки на мастер-узлы в кластере EMR, когда приложение spark, наконец, запустится оттуда?
Однако первый подход с использованием userClassPathFirst кажется лучшим маршрутом.