web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: org/Apache/spark/streaming/Twitter/TwitterUtils $ lors de l'exécution de TwitterPopularTags

Je suis débutant dans Spark Streaming et Scala. Pour une exigence de projet, j'essayais d'exécuter l'exemple TwitterPopularTags présent dans github. Comme SBT Assembly ne fonctionnait pas pour moi et que je ne connaissais pas SBT, j'essaie d'utiliser Maven pour la construction. Après beaucoup de problèmes initiaux, j'ai pu créer le fichier jar. Mais en essayant de l'exécuter, j'obtiens l'erreur suivante. Quelqu'un peut-il m'aider à résoudre ce problème?

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

J'ai ajouté les dépendances suivantes Spark-streaming_2.10: 1.1.0 Spark-core_2.10: 1.1.0 Spark-streaming-Twitter_2.10: 1.1.0

J'ai même essayé la version 1.2.0 pour Spark-streaming-Twitter, mais cela me donnait la même erreur.

Merci pour l'aide à l'avance.

Cordialement, Vpv

16
vpv

Merci d'avoir donné votre suggestion. J'ai pu résoudre ce problème en utilisant uniquement SBT Assembly. Voici les détails concernant la façon dont j'ai fait cela.

Spark - Déjà présent dans Cloudera VM Scala - Je ne sais pas s'il est présent dans Cloudera, sinon nous pouvons l'installer SBT - Cela doit également être installé. J'ai effectué les deux installations sur ma machine locale et transféré le fichier Jar à la machine virtuelle. Pour installer cela, j'ai utilisé le lien suivant

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

1) Une fois que tous ceux-ci sont créés. Nous devons créer le dossier parent de notre projet. J'ai créé un dossier appelé Twitter.

2) Créez un autre dossier avec la structure suivante Twitter/src/main/scala et créez le fichier .scala dans ce dossier avec le nom TwitterPopularTags.scala. Cela a légèrement changé par rapport au code que nous avons obtenu du github. Je devais changer les déclarations d'importation

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) Après cela, créez un autre dossier sous le dossier parent avec le nom suivant.

Twitter/projet

et créez un fichier nommé Assembly.sbt. Cela a le chemin pour le plugin Assembly. Voici le code complet présent dans le fichier.

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) Une fois les deux précédents créés, créez un fichier dans le répertoire parent du projet (Twitter) avec le nom build.sbt. C'est ici que nous devons fournir le nom du fichier .Jar que nous devons créer ainsi que les dépendances. Veuillez noter que même les lignes vierges entre les codes de ce fichier sont importantes.

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) Enfin, nous devons ouvrir le terminal et aller dans le dossier parent du projet (Twitter). À partir de là, entrez la commande suivante: 

sbt Assembly

Cela téléchargera les dépendances et créera le fichier jar dont nous avons besoin.

6) Pour exécuter le programme, nous avons besoin d'une application Twitter créée sous notre ID et fournissant le jeton d'authentification et d'autres détails. L'étape détaillée sur la façon de créer ceci est présente dans le lien suivant.

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

7) Une fois que tout est fait, nous pouvons utiliser la commande spark-submit de VM pour exécuter le travail. Exemple de commande est 

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

8) Ceci imprime la sortie sur la console, il est donc préférable de réduire la fréquence En ajustant le code.

S'il vous plaît laissez-moi savoir si d'autres détails sont nécessaires.

Merci et salutations

VPV

15
vpv

Nous avons trouvé une solution simple (qui fonctionne avec 1.5.1, mais peut-être aussi avec les versions précédentes):

Soumettez avec le paramètre --packages et les coordonnées Maven, comme:

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

Décrit à 

http://spark.Apache.org/docs/latest/programming-guide.html#using-the-Shell

8
Marek Dudek

Cette erreur signifie simplement qu’au moment de l’exécution, la classe TwitterUtils (ou l’objet TwitterUtils en langage scala) n’est pas présentée, mais lors de la compilation, elle est présentée (sinon, vous ne pourrez pas construire avec maven). Vous devez vous assurer que le fichier JAR que vous avez créé contient bien cette classe/cet objet. Vous pouvez simplement décompresser ce fichier jar pour voir ce qui est réellement inclus. Il est fort probable que votre fichier de construction maven utilise la dépendance pour construire le projet, mais ne l'inclut pas en fin de compte dans votre fichier JAR final. 

2
hexabunny

Essayez de le faire de cette façon ...

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

consommateurs consommateurs accès secret accès secret 

0
DeepikaB
    **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
0
Priyanshu Singh