【问题标题】:java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$ while running TwitterPopularTagsjava.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$ 同时运行 TwitterPopularTags
【发布时间】:2015-03-25 17:54:31
【问题描述】:

我是 Spark 流和 Scala 的初学者。对于项目要求,我试图运行 github 中的 TwitterPopularTags 示例。由于 SBT 组件对我不起作用并且我不熟悉 SBT,因此我正在尝试使用 Maven 进行构建。经过很多最初的打嗝,我能够创建 jar 文件。但是在尝试执行它时,我收到以下错误。谁能帮我解决这个问题?

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$
    at TwitterPopularTags$.main(TwitterPopularTags.scala:43)
    at TwitterPopularTags.main(TwitterPopularTags.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:331)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.twitter.TwitterUtils$
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 9 more

我添加了以下依赖项 火花流_2.10:1.1.0 Spark-core_2.10:1.1.0 Spark-streaming-twitter_2.10:1.1.0

我什至尝试了 Spark-streaming-twitter 的 1.2.0,但这也给了我同样的错误。

提前感谢您的帮助。

问候, 虚拟现实

【问题讨论】:

    标签: scala maven apache-spark noclassdeffounderror spark-streaming


    【解决方案1】:

    感谢您提出建议。我只能通过使用 SBT 程序集来解决这个问题。以下是有关我如何做到这一点的详细信息。

    Spark - 已存在于 Cloudera VM 中 Scala - 不确定 Cloudera 中是否存在,如果没有,我们可以安装它 SBT - 这也需要安装。我在本地机器上进行了安装并将 Jar 转移到 VM。为了安装它,我使用了以下链接

    https://gist.github.com/visenger/5496675

    1) 一旦创建了所有这些。我们必须为我们的项目创建父文件夹。我创建了一个名为 Twitter 的文件夹。

    2) 使用以下结构创建另一个文件夹 Twitter/src/main/scala,并在此文件夹中创建名为 TwitterPopularTags.scala 的 .scala 文件。这与我们从 github 获得的代码略有不同。我不得不更改导入语句

    import org.apache.spark.streaming.Seconds
    import org.apache.spark.streaming.StreamingContext
    import org.apache.spark.streaming.StreamingContext._
    import org.apache.spark.SparkContext._
    import org.apache.spark.streaming.twitter._
    import org.apache.spark.SparkConf
    

    3) 之后,在父文件夹下创建另一个文件夹,名称如下

    推特/项目

    并创建一个名为 assembly.sbt 的文件。这具有程序集插件的路径。以下是文件中的完整代码。

    resolvers += Resolver.url("sbt-plugin-releases-scalasbt", url("http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/"))
    
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
    

    4) 上述两个创建完成后,在项目(Twitter)的父目录中创建一个名为 build.sbt 的文件。这是我们需要提供我们需要创建的 .Jar 文件的名称以及依赖项的地方。请注意,即使此文件中代码之间的空行也很重要。

    name := "TwitterPopularTags"
    
    version := "1.0"
    
    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
       {
        case PathList("META-INF", xs @ _*) => MergeStrategy.discard
        case x => MergeStrategy.first
       }
    }
    
    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.0" % "provided"
    
    libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.1.0" % "provided"
    
    libraryDependencies += "org.apache.spark" %% "spark-streaming-twitter" % "1.2.0" 
    
    libraryDependencies += "org.twitter4j" % "twitter4j-stream" % "3.0.3" 
    
    resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
    

    5) 最后,我们必须打开终端并转到项目的父文件夹(Twitter)。从这里输入以下命令:

    sbt assembly
    

    这将下载依赖项并创建我们需要的 jar 文件。

    6) 为了运行程序,我们需要在我们的 ID 下创建一个 twitter 应用程序并提供身份验证令牌和其他详细信息。以下链接中提供了有关如何创建它的详细步骤。

    http://ampcamp.berkeley.edu/3/exercises/realtime-processing-with-spark-streaming.html

    7) 完成上述所有操作后,我们可以使用 VM 中的 spark-submit 命令来运行作业。示例命令是

    ./bin/spark-submit \
      --class TwitterPopularTags \
      --master local[4] \
      /path/to/TwitterPopilarTags.jar \
      comsumerkey consumersecret accesstoken accesssecret 
    

    8) 这会将输出打印到控制台,因此要监控输出,最好降低频率 通过调整代码。

    如果需要更多详细信息,请告诉我。

    感谢和问候,

    VPV

    【讨论】:

    • 谢谢,我遇到了同样的问题。我对另一个主题做了一个回答:stackoverflow.com/a/28498443/1480391 供那些需要更多信息的人使用.. :)
    • 谢谢@YvesM。 ,你的回答真的帮助了我 - 再次!我从你那里看到了很多拯救我生命的答案!
    【解决方案2】:

    找到了一个简单的解决方案(肯定适用于 1.5.1,但也可能适用于早期版本):

    使用--packages参数和Maven坐标提交,如:

    spark-submit --master local[*] \
        --class TwitterStreaming \
        --packages "org.apache.spark:spark-streaming-twitter_2.10:1.5.1" \
        ${PATH_TO_JAR_IN_TARGET}
    

    描述于

    http://spark.apache.org/docs/latest/programming-guide.html#using-the-shell

    【讨论】:

    • 这似乎是最简单的方法。
    • @Marek Dudek,当我添加 --packages "org.apache.spark:spark-streaming-twitter_2.10:1.5.1" 线程“main”中的异常 java.lang.NoClassDefFoundError: org /apache/spark/streaming/twitter/TwitterUtils 异常已解决,但我在线程“main”java.lang.NoClassDefFoundError: org/apache/spark/Logging 中遇到了新异常异常
    【解决方案3】:

    这个错误仅仅意味着在运行时 TwitterUtils 类(或在 Scala 语言中的 TwitterUtils 对象)没有被呈现,但是在编译时它被呈现(因为否则你将无法使用 maven 构建)。您应该确保您创建的 jar 文件确实包含该类/对象。您可以简单地解压缩该 jar 文件以查看实际包含的内容。您的 maven 构建文件很可能使用依赖项来构建项目,但最终不会将其包含在您的最终 jar 中。

    【讨论】:

      【解决方案4】:

      试着这样做......

      ./bin/spark-submit \
        --class TwitterPopularTags \
        --jars (external_jars like twitter4j,streaming-twitter) \
        --master local[4] \
        /path/to/TwitterPopilarTags.jar \
      

      comsumerkey consumersecret accesstoken accesssecret

      【讨论】:

        【解决方案5】:
            **I have the same problem and I am not able to fix**
        
        
            name := "SentimentAnalyser"
        
            version := "0.1"
        
            scalaVersion := "2.11.11"
        
        
        
            libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.2.0"
        
            // https://mvnrepository.com/artifact/org.apache.spark/park-streaming-twitter_2.11
        
            // https://mvnrepository.com/artifact/org.apache.spark/spark-streaming_2.11
            libraryDependencies += "org.apache.spark" % "spark-streaming-twitter_2.11" % "2.0.0"
            libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.2.0"
        
            package com
        
            import org.apache.spark.SparkConf
            import org.apache.spark.streaming.{Seconds, StreamingContext}
            import org.apache.spark.streaming.twitter.TwitterUtils
        
            object Sentiment {
        
              def main(args: Array[String]): Unit = {
        
                if(args.length<4){
                  System.out.print("Enter Consumer Key (API Key) Consumer Secret (API Secret)Access Token Access Token Secret")
                  System.exit(1);
                }
        
                val Array(customer_key,customer_secrect,access_token,access_token_secret)=args.take(4)
        
                System.setProperty("twiteer4j.oauth.consumerKey",customer_key)
                System.setProperty("twiteer4j.oauth.customerSecret",customer_secrect)
                System.setProperty("twiteer4j.oauth.accessToken",access_token)
                System.setProperty("twiteer4j.oauth.accessTokenSecret",access_token_secret)
        
                val conf=new SparkConf().setAppName("Sentiment").setMaster("local")
                val scc=new StreamingContext(conf,Seconds(30))
                //Dstream
                val stream=TwitterUtils.createStream(scc,None)
        
                val hashTag=stream.flatMap(status=>{status.getText.split(" ").filter(_.startsWith("#"))})
        
                val topHashTag60=hashTag.map((_,1)).reduceByKeyAndWindow(_+_,Seconds(60))
                  .map{case (topic,count)=>(topic,count)}.transform(_.sortByKey(false))
        
                val topHashTag10=hashTag.map((_,1)).reduceByKeyAndWindow(_+_,Seconds(10))
                  .map{case (topic,count)=>(topic,count)}.transform(_.sortByKey(false))
        
        
                topHashTag60.foreachRDD(rdd=>{
                  val topList=rdd.take(10)
                  println("Popular topic in last 60 sec (%s total)".format(rdd.count()))
                  topList.foreach{case (count,tag)=>println("%s (%s tweets)".format(tag,count))}
                })
        
                topHashTag10.foreachRDD(rdd=>{
                  val topList=rdd.take(10)
                  println("Popular topic in last 10 sec (%s total)".format(rdd.count()))
                  topList.foreach{case (count,tag)=>println("%s (%s tweets)".format(tag,count))}
                })
        
        
                scc.start()
                scc.awaitTermination()
        
        
        
        
        
        
        
        
              }
        
            }
        
        
        
        
        
        
        I build jar using artifact in IJ ..
        
        
        spark-submit --class com.Sentiment  /root/Desktop/SentimentAnalyser.jar XX XX XX XX
        
        
        ERROR:
        17/10/29 01:22:24 INFO BlockManager: Initialized BlockManager: BlockManagerId(driver, 192.168.46.132, 34179, None)
        17/10/29 01:22:27 WARN StreamingContext: spark.master should be set as local[n], n > 1 in local mode if you have receivers to get data, otherwise Spark jobs will not get resources to process the received data.
        Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/twitter/TwitterUtils$
                at com.Sentiment$.main(Sentiment.scala:26)
                at com.Sentiment.main(Sentiment.scala)
                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 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:755)
                at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
                at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
                at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
                at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
        Caused by: java.lang.ClassNotFoundException: org.apache.spark.streaming.twitter.TwitterUtils$
                at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
                at java.lang.ClassLoader.loadClass(ClassLoader.java
        

        【讨论】:

          【解决方案6】:

          要将依赖项包含在您的 jar 中,您需要指示 Maven 构建一个“胖 jar”。 “fat jar”是一个包含 .class 文件的 jar,不仅适用于您的项目,还适用于所有必需的依赖项(这是 sbt 程序集所做的)。默认的 Maven 行为是将您的项目视为一个库,因此构建一个仅包含您的 .class 文件的 jar。

          这是一个简单的 maven pom,它可以做你想做的事,注意我已经包含了一些其他常见的 Spark + Maven 行为,例如使用 Scala,但最相关的部分靠近底部:

          <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.jmess.sparkexamples</groupId>
              <artifactId>example</artifactId>
              <version>1.0.0</version>
          
              <properties>
                  <!-- Use java 1.8 -->
                  <maven.compiler.source>1.8</maven.compiler.source>
                  <maven.compiler.target>1.8</maven.compiler.target>
                  <!-- Keep compiled against scala version uniform -->
                  <scala.base.version>2.11</scala.base.version>
                  <!-- Use most recent version of Scala compatible with stable Spark release -->
                  <scala.version>${scala.base.version}.12</scala.version>
                  <!-- Facilitates keeping multiple Spark dependencies aligned  -->
                  <spark.version>2.4.0</spark.version>
              </properties>
          
              <dependencies>
                  <!-- Begin Spark Dependencies -->
                  <!-- Provides the base Spark APIs. Required for base functionality -->
                  <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
                  <dependency>
                      <groupId>org.apache.spark</groupId>
                      <artifactId>spark-sql_${scala.base.version}</artifactId>
                      <version>${spark.version}</version>
                      <!-- In most cases this dependency is supplied by Spark -->
                      <scope>provided</scope>
                  </dependency>
                  <!-- Provides the expanded APIs for Streaming with Kafka. Required in addition to spark-sql library -->
                  <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql-kafka-0-10 -->
                  <dependency>
                      <groupId>org.apache.spark</groupId>
                      <artifactId>spark-sql-kafka-0-10_${scala.base.version}</artifactId>
                      <version>${spark.version}</version>
                  </dependency>
                  <!-- End Spark Dependencies -->
          
                  <!-- Popular scala configuration library -->
                  <dependency>
                      <groupId>com.typesafe</groupId>
                      <artifactId>config</artifactId>
                      <version>1.3.2</version>
                  </dependency>
                  <!-- To write to Splunk HTTP endpoint -->
              </dependencies>
          
              <build>
                  <!-- Tells scala-maven-plugin where to look -->
                  <sourceDirectory>src/main/scala</sourceDirectory>
                  <testSourceDirectory>src/test/scala</testSourceDirectory>
          
                  <plugins>
                      <!-- For building scala projects using maven -->
                      <plugin>
                          <groupId>net.alchim31.maven</groupId>
                          <artifactId>scala-maven-plugin</artifactId>
                          <version>4.0.1</version>
                          <!-- Includes the compiled Scala .class files in some maven goals -->
                          <executions>
                              <execution>
                                  <goals>
                                      <goal>add-source</goal>
                                      <goal>compile</goal>
                                      <goal>testCompile</goal>
                                  </goals>
                              </execution>
                          </executions>
                      </plugin>
                      <!-- !!!!!!! BUILD FAT JAR !!!!!!! -->
                      <!-- Build a fat jar named example-1.0.0-jar-with-dependencies.jar -->
                      <plugin>
                          <artifactId>maven-assembly-plugin</artifactId>
                          <version>3.1.1</version>
                          <configuration>
                              <descriptorRefs>
                                  <descriptorRef>jar-with-dependencies</descriptorRef>
                              </descriptorRefs>
                          </configuration>
                          <executions>
                              <execution>
                                  <id>make-assembly</id> <!-- this is used for inheritance merges -->
                                  <phase>package</phase> <!-- bind to the packaging phase -->
                                  <goals>
                                      <goal>single</goal>
                                  </goals>
                              </execution>
                          </executions>
                      </plugin>
                  </plugins>
              </build>
          
          </project>
          

          注意**如果您通过 spark 而不是 yarn 提交工作,请取消注释 &lt;scope&gt;provided&lt;/scope&gt;

          【讨论】:

            【解决方案7】:

            我遇到了同样的问题,通过从 sbt 中删除“provided”来解决它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-08-20
              • 2017-03-10
              • 2020-08-31
              • 1970-01-01
              • 2018-08-11
              相关资源
              最近更新 更多