【问题标题】:java.lang.NoClassDefFoundError: org/apache/spark/Loggingjava.lang.NoClassDefFoundError: org/apache/spark/Logging
【发布时间】:2017-03-10 07:06:22
【问题描述】:

我总是收到以下错误。有人可以帮帮我吗?

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/Logging
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.datastax.spark.connector.japi.DStreamJavaFunctions.<init>(DStreamJavaFunctions.java:24)
    at com.datastax.spark.connector.japi.CassandraStreamingJavaUtil.javaFunctions(CassandraStreamingJavaUtil.java:55)
    at SparkStream.main(SparkStream.java:51)
    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:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.Logging
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 20 more

当我编译以下代码时。我在网上搜索过,但没有找到解决方案。添加 saveToCassandra 时出现错误。

import com.datastax.spark.connector.japi.CassandraStreamingJavaUtil;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;

import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow;

/**
 * Created by jonas on 10/10/16.
 */
public class SparkStream implements Serializable{
        public static void main(String[] args) throws Exception{
        SparkConf conf = new SparkConf(true)
                .setAppName("TwitterToCassandra")
                .setMaster("local[*]")
                .set("spark.cassandra.connection.host", "127.0.0.1")
                .set("spark.cassandra.connection.port", "9042");
;
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaStreamingContext ssc = new JavaStreamingContext(sc, new Duration(5000));

        Map<String, String> kafkaParams = new HashMap<>();
        kafkaParams.put("bootstrap.servers", "localhost:9092");
        Set<String> topics = Collections.singleton("Test");

        JavaPairInputDStream<String, String> directKafkaStream = KafkaUtils.createDirectStream(
                ssc,
                String.class,
                String.class,
                kafka.serializer.StringDecoder.class,
                kafka.serializer.StringDecoder.class,
                kafkaParams,
                topics
        );

        JavaDStream<Tweet> createTweet = directKafkaStream.map(s -> createTweet(s._2));


        CassandraStreamingJavaUtil.javaFunctions(createTweet)
                .writerBuilder("mykeyspace", "rawtweet", mapToRow(Tweet.class))
                .saveToCassandra();

        ssc.start();
        ssc.awaitTermination();

    }


    public static Tweet createTweet(String rawKafka){
        String[] splitted = rawKafka.split("\\|");
        Tweet t = new Tweet(splitted[0], splitted[1], splitted[2], splitted[3]);
        return t;
    }
}

我的 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>com.company</groupId>
    <artifactId>Sentiment</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>twitter4j.org</id>
            <name>twitter4j.org Repository</name>
            <url>http://twitter4j.org/maven2</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.10</artifactId>
            <version>2.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.10</artifactId>
            <version>2.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
            <version>2.0.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.scala-lang/scala-library -->
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.8</version>
        </dependency>



        <!-- https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector_2.10 -->
        <dependency>
            <groupId>com.datastax.spark</groupId>
            <artifactId>spark-cassandra-connector_2.10</artifactId>
            <version>1.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.10</artifactId>
            <version>0.9.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-core</artifactId>
            <version>[4.0,)</version>
        </dependency>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-stream</artifactId>
            <version>4.0.4</version>
        </dependency>

        <dependency>
            <groupId>org.twitter4j</groupId>
            <artifactId>twitter4j-async</artifactId>
            <version>4.0.4</version>
        </dependency>
    </dependencies>


</project>

【问题讨论】:

    标签: java maven apache-spark cassandra spark-cassandra-connector


    【解决方案1】:

    org.apache.spark.Logging 在 Spark 1.5.2 或更低版本中可用。它不在 2.0.0 中。请按如下方式更改版本

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>1.5.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.10</artifactId>
            <version>1.5.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.10</artifactId>
            <version>1.5.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
            <version>1.6.2</version>
        </dependency>
    

    【讨论】:

    • 非常感谢
    • 那使用更高版本的spark有什么用呢?如何做到这一点 2.x 版 spark
    • 这无法构建:org.apache.spark:spark-streaming-kafka-0-8_2.11:jar:1.6.2 的 POM 丢失,没有可用的依赖信息
    • 尝试从网上下载并复制到您的位置。这可能有助于下载 jar。 jar-download.com/…
    【解决方案2】:

    错误是因为您使用 Spark 2.0 库和 Spark 1.6 中的连接器(它会查找 Spark 1.6 日志记录类。使用 2.0.5 版本的连接器。

    【讨论】:

    • 如果你使用 pyspark 会怎样?
    • 答案是一样的
    • 谢谢@RussS 似乎是最好的解决方案,我找不到如何在 python 上更新连接器,有人知道怎么做吗?
    【解决方案3】:

    可能导致此问题的一个原因是lib 和类冲突。 我遇到了这个问题并使用了一些 ma​​ven 排除

    <dependency>
           <groupId>org.apache.spark</groupId>
           <artifactId>spark-core_2.11</artifactId>
           <version>2.0.0</version>
           <scope>provided</scope>
           <exclusions>
               <exclusion>
                   <groupId>log4j</groupId>
                   <artifactId>log4j</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
    
       <dependency>
           <groupId>org.apache.spark</groupId>
           <artifactId>spark-streaming_2.11</artifactId>
           <version>2.0.0</version>
           <scope>provided</scope>
       </dependency>
    
       <dependency>
           <groupId>org.apache.spark</groupId>
           <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
           <version>2.0.0</version>
           <exclusions>
               <exclusion>
                   <groupId>org.slf4j</groupId>
                   <artifactId>slf4j-log4j12</artifactId>
               </exclusion>
               <exclusion>
                   <groupId>log4j</groupId>
                   <artifactId>log4j</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
    

    【讨论】:

      【解决方案4】:

      这是版本问题尝试使用最新版本

      <dependency>
                  <groupId>org.apache.spark</groupId>
                  <artifactId>spark-sql_2.11</artifactId>
                  <version>2.1.0</version>
                  <scope>provided</scope>
              </dependency>
               <dependency>
                  <groupId>org.apache.spark</groupId>
                  <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
                  <version>2.1.1</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.spark</groupId>
                  <artifactId>spark-streaming_2.11</artifactId>
                  <version>2.1.0</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.spark</groupId>
                  <artifactId>spark-core_2.11</artifactId>
                  <version>2.1.0</version>
              </dependency>
      

      【讨论】:

        【解决方案5】:

        您的依赖项 jar 列表中缺少日志记录 Jar。尝试从 mvn 存储库下载“spark-core_2.11-1.5.2.logging”jar,然后将其作为外部 jar 添加到您的 spark 项目中,您不会得到“java.lang.NoClassDefFoundError: org/apache/spark/记录”错误。 根据 scala 版本,您可以下载 jar{2.10,2.11,etc}。

        【讨论】:

        • 为什么要下载并添加为外部 jar。为什么不直接在 pom 中添加依赖呢?
        • 是的,我同意你的评论,想想如果你的系统中安装了高于 spark 1.5.2 (ex 2.xx) 的版本,那么下载与 1.5.2 版本相关的所有 jars 有什么用,这有意义吗?,它会通过版本兼容性之类的错误。
        • 我将 jar 添加到依赖项中。仍然不行。线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/spark/Logging at java.lang.ClassLoader.defineClass1(Native Method)在 java.lang.ClassLoader.defineClass(ClassLoader.java:763) 在
        • 下载 jar 并在 spark-submit spark-submit --class com.SentimentTwiteer --packages "org.apache.spark:spark-streaming-twitter_2.11:1.6.3 中使用 --jars " --jars /root/Desktop/spark-core_2.11-1.5.2.logging.jar /root/Desktop/SentimentTwiteer.jar XX XX XX XX
        【解决方案6】:

        这个 pom.xml 解决了我的问题:

                <dependency>
                    <groupId>org.apache.spark</groupId>
                    <artifactId>spark-core_2.10</artifactId>
                    <version>1.6.1</version>
                </dependency>
        
                <dependency>
                    <groupId>org.apache.spark</groupId>
                    <artifactId>spark-streaming_2.10</artifactId>
                    <version>1.6.1</version>
                </dependency>
        

        【讨论】:

          【解决方案7】:

          下载 jar 并在 spark-submit 中使用 --jars ,为我工作 spark-submit --class com.SentimentTwiteer --packages "org.apache.spark:spark-streaming-twitter_2.11:1.6.3" --jars /root/Desktop/spark-core_2.11-1.5.2.logging .jar /root/Desktop/SentimentTwiteer.jar XX XX XX XX

          【讨论】:

            【解决方案8】:

            下载 spark-core_2.11-1.5.2.logging.jar 并用作 --jar 选项

            spark-submit --class com.SentimentTwiteer --packages "org.apache.spark:spark-streaming-twitter_2.11:1.6.3" --jars /root/Desktop/spark-core_2.11-1.5。 2.logging.jar /root/Desktop/SentimentTwiteer.jar consumerKey consumerSecret accessToken accessTokenSecret yoursearchTag

            https://github.com/sinhavicky4/SentimentTwiteer

            【讨论】:

              【解决方案9】:

              我通过更改上述 jar 得到了解决方案。

              最初,我有用于 spark-kafka-streaming 的降级 jar:

              <dependency>
                      <groupId>org.apache.spark</groupId>
                      <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
                      <version>2.1.1</version></dependency>
              

              我还删除了我从 spark 和 kafka jar 库外部添加的多个 sl4j-log4j.jars 和 log4j.jars。

              【讨论】:

                【解决方案10】:

                就像大家说的那样,这是因为自 1.5.2 以来缺少 org.apache.spark.Logging 类。 (以后版本只存在org.apache.spark.internal.Logging...)

                但似乎没有一个针对 maven 的解决方案可以解决这种依赖关系,所以我只是尝试手动将这个类添加到 lib。这是我解决问题的方法:

                1. 将 scala org.apache.spark.internal.Logging 打包到公共 jar 中。或者从https://raw.githubusercontent.com/swordsmanliu/SparkStreamingHbase/master/lib/spark-core_2.11-1.5.2.logging.jar下载(感谢楼主)

                2. 将 jar 移动到 spark 集群的 jars 目录中。

                3. 再次提交您的项目,希望对您有所帮助。

                【讨论】:

                  【解决方案11】:

                  下载下面的Jar,并将其放入您的库中,它将按预期工作。

                  https://raw.githubusercontent.com/swordsmanliu/SparkStreamingHbase/master/lib/spark-core_2.11-1.5.2.logging.jar

                  【讨论】:

                    【解决方案12】:

                    如果您使用的是 IntelliJ,只需选中“包含具有提供范围的依赖项”框,这将为您解决问题,而无需处理 pom 或手动下载文件。

                    【讨论】:

                      猜你喜欢
                      • 2019-06-01
                      • 1970-01-01
                      • 2010-11-26
                      • 2021-07-22
                      • 2017-03-24
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-08-23
                      相关资源
                      最近更新 更多