Не удалось отправить Java-приложение Spring boot в кластер Spark
Я разработал веб-приложение с Spring Boot, которое использует Apache Spark для запроса данных из разных источников данных (например, Oracle). В начале я планировал запустить приложение без отправки его с помощью сценария spark-submit, но похоже, что я не могу подключиться к главному кластеру без отправки jar. Я успешно создал Uber jar, который включает в себя все зависимости и подпроекты, которые я использую, но кажется, что Искра не любит весну Загрузочные приложения. Когда я пытаюсь отправить приложение, spark показывает следующую ошибку:
Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from file:/home/rojasmi1/spark/spark-1.4.0/assembly/target/scala-2.10/spark-assembly-1.4.0-hadoop2.2.0.jar). If you are using Weblogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml Object of class [org.slf4j.impl.Log4jLoggerFactory] must be an instance of class ch.qos.logback.classic.LoggerContext
at org.springframework.util.Assert.isInstanceOf(Assert.java:339)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:151)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLogger(LogbackLoggingSystem.java:143)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:89)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationStartedEvent(LoggingApplicationListener.java:152)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128)
at org.springframework.boot.context.event.EventPublishingRunListener.publishEvent(EventPublishingRunListener.java:100)
at org.springframework.boot.context.event.EventPublishingRunListener.started(EventPublishingRunListener.java:54)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:277)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at ch.dlx.QubidaOracleConnectorApplication.main(QubidaOracleConnectorApplication.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:664)
at org.apache.spark.deploy.SparkSubmit$.doRunMain(SparkSubmit.scala:169)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:192)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:111)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
использование профиля log4j Spark по умолчанию: org/apache/spark / log4j-по умолчанию.свойства
Я попытался исключить зависимость slf4j-log4j12 в файле pom, но я все еще получаю ту же ошибку.
файл pom содержит следующую конфигурацию:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.dlx</groupId>
<artifactId>qubida-oracle-connector</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>qubida-oracle-connector</name>
<description></description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>1.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-hadoop-core</artifactId>
<version>1.3.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- DB Drivers -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
<artifactSet>
<excludes>
<exclude>org.slf4j</exclude>
</excludes>
</artifactSet>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
есть ли способ отправить приложение Spring Boot в кластер? Должен ли я использовать другой тип проекта с учетом того, что мне нужно предоставить RESTful API? Есть ли способ подключения к кластеру spark без отправки .банку?
заранее спасибо за вашу помощь.
3 ответов
У меня была аналогичная проблема, для ее решения попробуйте удалить весенний журнал загрузки со следующим исключением:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Если вы все еще получаете ошибку при инициализации сервлета
java.ленг.NoSuchMethodError: javax.сервлет.Объекта servletcontext.getVirtualServerName () Ljava/lang/String;
затем попробуйте использовать 1.2.1.Выпуск версии родителя starter, так как это вызвано версией servlet-api, используемой Spark Группа.
во время сборки Spring Boot смотрит, включили ли вы определенную реализацию ведения журнала в свою сборку и, если нет, использует Logback по умолчанию. По-видимому, Spark добавляет Log4J в путь к классам при запуске приложения, что, в свою очередь, вызывает ошибку во время выполнения, потому что Spring Boot теперь находит два логгера implementions на пути к классам: тот, который он включил во время сборки (Logback) и одна искра добавляет во время выполнения (Log4J).
Если Spark предоставляет способ подавите включение Log4J во время выполнения, вы можете сделать это и просто позволить Spring Boot wire в Logback по умолчанию.
Если Spark заставляет Log4J на вас, то решением было бы явно включить Log4J (не Logback) в вашу сборку, чтобы Spring Boot "видел" это время сборки и, таким образом, не включал Logback.
EDIT:я должен был проверить свое предположение, посмотрев на документы Spring Boot. Вы также должны явно исключить Log4J. См.Весна загрузки Ведение Журнала Документов.
Spark поддерживает только log4j. Чтобы заставить spring-boot использовать log4j вместо logback по умолчанию, примените эта процедура из справочной документации spring-boot но обязательно измените log4j2 на log4j и дайте ему версию, например 1.2.17.
Вам также нужно будет поставить log4j.файл свойств в src/main/resources
. Вы можете скопировать log4j.свойства.шаблон из каталога Spark /conf и переименуйте его в log4j.свойства.