0

I am trying to create a simple web application using Spring Boot and Apache Spark by Intellij.

SparkConfiguration.java

package com.example.sparkspringboot4;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
@Configuration
@ConfigurationProperties(prefix = "spark")
@EnableConfigurationProperties
public class SparkConfiguration {

    private String sparkHome = ".";

    private String appName = "sparkPatrol";

    private String master = "local";

    @Bean
    @ConditionalOnMissingBean(SparkConf.class)
    public SparkConf sparkConf() {
        SparkConf conf = new SparkConf().setAppName(appName).setMaster(master);
        return conf;
    }

    @Bean
    @ConditionalOnMissingBean(JavaSparkContext.class)
    public JavaSparkContext javaSparkContext() {
        return new JavaSparkContext(sparkConf());
    }

    public String getSparkHome() {
        return sparkHome;
    }

    public void setSparkHome(String sparkHome) {
        this.sparkHome = sparkHome;
    }

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }

    public String getMaster() {
        return master;
    }

    public void setMaster(String master) {
        this.master = master;
    }
}

And the pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>SparkSpringBoot4</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SparkSpringBoot4</name>
    <description>SparkSpringBoot4</description>
    <properties>
        <java.version>17</java.version>
        <scala.version>2.12</scala.version>
        <spark.version>2.4.4</spark.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>


        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

But it got failure during run:

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    org.apache.spark.internal.Logging$.org$apache$spark$internal$Logging$$isLog4j12(Logging.scala:205)

The following method did not exist:

    'org.slf4j.impl.StaticLoggerBinder org.slf4j.impl.StaticLoggerBinder.getSingleton()'

The calling method's class, org.apache.spark.internal.Logging$, was loaded from the following location:

    jar:file:/C:/Users/XXX/.m2/repository/org/apache/spark/spark-core_2.12/2.4.4/spark-core_2.12-2.4.4.jar!/org/apache/spark/internal/Logging$.class

The called method's class, org.slf4j.impl.StaticLoggerBinder, is available from the following locations:

    jar:file:/C:/Users/XXX/.m2/repository/org/slf4j/slf4j-log4j12/1.5.2/slf4j-log4j12-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class

The called method's class hierarchy was loaded from the following locations:

    org.slf4j.impl.StaticLoggerBinder: file:/C:/Users/XXX/.m2/repository/org/slf4j/slf4j-log4j12/1.5.2/slf4j-log4j12-1.5.2.jar


Action:

Correct the classpath of your application so that it contains compatible versions of the classes org.apache.spark.internal.Logging$ and org.slf4j.impl.StaticLoggerBinder


Process finished with exit code 1

The reason I added org.slf4j dependency is based on NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

Is there any clue for this issue? Thanks!

Edit: The reason I added org.slf4j dependency is because of the failure I faced initially. Below is the error message without this org.slf4j dependency.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'javaSparkContext' defined in class path resource [com/example/sparkspringboot4/SparkConfiguration.class]: Failed to instantiate [org.apache.spark.api.java.JavaSparkContext]: Factory method 'javaSparkContext' threw exception with message: org/slf4j/impl/StaticLoggerBinder
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:659) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:493) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:941) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:733) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:435) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1305) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1294) ~[spring-boot-3.1.0.jar:3.1.0]
    at com.example.sparkspringboot4.SparkSpringBoot4Application.main(SparkSpringBoot4Application.java:10) ~[classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.spark.api.java.JavaSparkContext]: Factory method 'javaSparkContext' threw exception with message: org/slf4j/impl/StaticLoggerBinder
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.0.9.jar:6.0.9]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:655) ~[spring-beans-6.0.9.jar:6.0.9]
    ... 18 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
    at org.apache.spark.internal.Logging$.org$apache$spark$internal$Logging$$isLog4j12(Logging.scala:205) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.initializeLogging(Logging.scala:119) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.initializeLogIfNecessary(Logging.scala:108) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.initializeLogIfNecessary$(Logging.scala:102) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.SparkContext.initializeLogIfNecessary(SparkContext.scala:73) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.initializeLogIfNecessary(Logging.scala:99) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.initializeLogIfNecessary$(Logging.scala:98) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.SparkContext.initializeLogIfNecessary(SparkContext.scala:73) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.log(Logging.scala:46) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.log$(Logging.scala:44) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.SparkContext.log(SparkContext.scala:73) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.logInfo(Logging.scala:54) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.internal.Logging.logInfo$(Logging.scala:53) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.SparkContext.logInfo(SparkContext.scala:73) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:183) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:58) ~[spark-core_2.12-2.4.4.jar:2.4.4]
    at com.example.sparkspringboot4.SparkConfiguration.javaSparkContext(SparkConfiguration.java:34) ~[classes/:na]
    at com.example.sparkspringboot4.SparkConfiguration$$SpringCGLIB$$0.CGLIB$javaSparkContext$7(<generated>) ~[classes/:na]
    at com.example.sparkspringboot4.SparkConfiguration$$SpringCGLIB$$2.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.0.9.jar:6.0.9]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.0.9.jar:6.0.9]
    at com.example.sparkspringboot4.SparkConfiguration$$SpringCGLIB$$0.javaSparkContext(<generated>) ~[classes/:na]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.9.jar:6.0.9]
    ... 19 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    ... 44 common frames omitted
Ted
  • 189
  • 1
  • 3
  • 13
  • Spring Boot 3.1 uses slf4j 2 not Slf4j 1.x hence you are adding/using incmopatible versions. – M. Deinum Jun 10 '23 at 10:06
  • And otherwise, using the 1.5.2 version of `org.slf4j:slf4j-log4j12` would be too old anyway; it should always match the version of the slf4j-api. As an aside, why are you even still using Log4J 1? IIRC, it has problems when used on Java 17. – Mark Rotteveel Jun 10 '23 at 10:08
  • I see.. I just updated my question to elaborate my initial question and why I added this dependency. Do you have any better idea for this issue? – Ted Jun 10 '23 at 10:42
  • Read current documentation of slf4j and log4j2 to see how to add current dependencies. You should have started there before posting a question. – aled Jun 11 '23 at 01:17

0 Answers0