15

io sono un principiante in streaming Spark e Scala. Per un requisito del progetto stavo cercando di eseguire l'esempio di TwitterPopularTags presente in github. Dato che l'assemblaggio SBT non funzionava per me e non avevo familiarità con SBT, sto cercando di usare Maven per la costruzione. Dopo un sacco di intoppi iniziali, sono stato in grado di creare il file jar. Ma mentre provo ad eseguirlo, sto ricevendo il seguente errore. Qualcuno può aiutarmi a risolvere questo?

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 

ho aggiunto seguenti dipendenze Spark-streaming_2.10: 1.1.0 Spark-core_2.10: 1.1.0 Spark-streaming-twitter_2.10: 1.1.0

ho anche ho provato la versione 1.2.0 per Spark-streaming-twitter ma anche questo mi ha dato lo stesso errore.

Grazie per l'aiuto in anticipo.

saluti, VPV

risposta

2

Questo errore significa semplicemente che in classe TwitterUtils runtime (o in scala TwitterUtils linguaggio object) non viene presentato, tuttavia al momento della compilazione si è presentato (perché altrimenti non sarà in grado di costruisci con Maven). Dovresti assicurarti che il file jar che hai creato contenga effettivamente quella classe/oggetto. Puoi semplicemente decomprimere quel file jar per vedere cosa è effettivamente incluso. Molto probabilmente il tuo file di costruzione di Maven usa la dipendenza per costruire il progetto ma alla fine non lo include nel tuo vaso finale.

15

Grazie per aver dato il suo suggerimento. Sono stato in grado di risolvere questo problema utilizzando solo l'assembly SBT. Di seguito sono riportati i dettagli su come ho fatto questo.

Spark - Già presente in Cloudera VM Scala - Non sono sicuro se questo è presente in Cloudera, in caso contrario possiamo installarlo SBT - Anche questo deve essere installato. Ho fatto entrambe le installazioni sul mio computer locale e ho trasferito il Jar alla VM. Per l'installazione di questo ho usato il seguente link

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

1) Una volta che tutti questi sono creati. Dobbiamo creare la cartella principale per il nostro progetto. Ho creato una cartella chiamata Twitter.

2) Creare un'altra cartella con la seguente struttura Twitter/src/main/scala e creare il file .scala in questa cartella con il nome TwitterPopularTags.scala. Questo ha lievi cambiamenti dal codice che abbiamo ottenuto dal github. Ho dovuto cambiare le dichiarazioni di importazione

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) Dopo questo, creare un'altra cartella nella cartella principale con il seguente nome

Twitter/progetto

e creare un file con l'Assemblea nome. sbt. Questo ha il percorso per il plugin di assemblaggio. Di seguito è riportato il codice completo presente nel file.

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) Una volta che i due sopra sono creati, creare un file nella directory principale del progetto (Twitter) con il nome build.sbt. Qui è dove dobbiamo fornire il nome del file .Jar che dobbiamo creare e anche le dipendenze. Si noti che anche le righe vuote tra i codici in questo file sono importanti.

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) Infine, dobbiamo aprire il terminale e passare alla cartella principale del progetto (Twitter). Da qui immettere il seguente comando:

sbt assembly 

Questo scaricherà le dipendenze e creerà il file jar di cui abbiamo bisogno.

6) Per eseguire il programma è necessaria un'app di twitter creata con il nostro ID e fornire il token di autenticazione e altri dettagli. Il passaggio dettagliato su come creare questo è presente nel seguente link.

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

7) Una volta che abbiamo fatto tutto quanto sopra si può usare il comando scintilla presentare da VM per eseguire il lavoro. Esempio comando è

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

8) stampata l'output alla console in modo da monitorare l'uscita è preferibile ridurre la frequenza regolando il codice.

Per favore fatemi sapere se sono necessari ulteriori dettagli.

Grazie & saluti,

VPV

+1

Grazie, ho avuto lo stesso problema. Ho fatto un rispondente a un altro argomento: http://stackoverflow.com/a/28498443/1480391 per coloro che hanno bisogno di maggiori informazioni .. :) –

+1

Grazie @ YvesM. , la tua risposta mi ha davvero aiutato - ancora! Ho visto molte risposte da te che mi hanno salvato la vita! – Paladini

0

Provate a farlo in questo modo ...

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

comsumerkey consumersecret access token accesssecret

8

trovato una soluzione semplice (che funziona con 1.5 .1 di sicuro ma forse anche con versioni precedenti):

Invia con --packages parametri e coordinate Maven, come:

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

descritto al

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

+0

Questo sembra essere il modo più semplice per farlo. –

+1

@Marek Dudek, quando aggiungo --packages "org.apache.spark: spark-streaming-twitter_2.10: 1.5.1" Eccezione nel thread "main" java.lang.NoClassDefFoundError: org/apache/spark/streaming/l'eccezione twitter/TwitterUtils è stata risolta ma ho ottenuto una nuova eccezione Eccezione nel thread "main" java.lang.NoClassDefFoundError: org/apache/spark/Logging – user4342532

0
**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 
Problemi correlati