java.lang.NoClassDefFoundError: org / apache / spark / streaming / twitter / TwitterUtils $ durante a execução do TwitterPopularTags

Eu sou um iniciante em streaming de Spark e Scala. Para um requisito de projeto, eu estava tentando executar o exemplo de TwitterPopularTags presente no github. Como a assembly do SBT não estava funcionando para mim e eu não estava familiarizado com o SBT, estou tentando usar o Maven para construção. Depois de muitos soluços iniciais, consegui criar o arquivo jar. Mas ao tentar executá-lo estou recebendo o seguinte erro. Alguém pode me ajudar a resolver isso?

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 

Eu adicionei as seguintes dependencies Spark-streaming_2.10: 1.1.0 Spark-core_2.10: 1.1.0 Spark-streaming-twitter_2.10: 1.1.0

Eu até tentei o 1.2.0 para Spark-streaming-twitter, mas que também estava me dando o mesmo erro.

Obrigado pela ajuda antecipadamente.

Atenciosamente, vpv

Obrigado por dar sua sugestão. Consegui resolver esse problema usando somente o assembly do SBT. A seguir estão os detalhes sobre como eu fiz isso.

Spark – Já está presente no Cloudera VM Scala – Não tenho certeza se isso está presente no Cloudera, se não podemos instalá-lo SBT – Isso também precisa ser instalado. Fiz as duas instalações na minha máquina local e transferi o Jar para a VM. Para instalar isso eu usei o seguinte link

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

1) Uma vez que todos estes são criados. Temos que criar a pasta pai para o nosso projeto. Eu criei uma pasta chamada Twitter.

2) Crie outra pasta com a seguinte estrutura: Twitter / src / main / scala e crie o arquivo .scala nesta pasta com o nome TwitterPopularTags.scala. Isso tem pequenas mudanças em relação ao código que obtivemos no github. Eu tive que mudar as declarações de importação

 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) Depois disso, crie outra pasta sob a pasta pai com o seguinte nome

Twitter / projeto

e crie um arquivo com o nome assembly.sbt. Isto tem o caminho para o plugin de assembly. A seguir está o código completo presente no arquivo.

 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) Depois que os dois acima forem criados, crie um arquivo no diretório pai do projeto (Twitter) com o nome build.sbt. É aqui que precisamos fornecer o nome do arquivo .Jar que precisamos criar e também as dependencies. Por favor, note que mesmo as linhas em branco entre os códigos neste arquivo são 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) Finalmente temos que abrir o terminal e ir para a pasta pai do projeto (Twitter). Daqui, digite o seguinte comando:

 sbt assembly 

Isso fará o download das dependencies e criará o arquivo jar que precisamos.

6) Para executar o programa, precisamos de um aplicativo do Twitter criado sob nosso ID e fornecer o token de autenticação e outros detalhes. A etapa detalhada sobre como criar isso está presente no link a seguir.

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

7) Uma vez que tenhamos feito todo o acima, podemos usar o comando spark-submit da VM para executar o trabalho. Exemplo de comando é

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

8) Isso imprime a saída para o console, portanto, para monitorar a saída, é melhor reduzir a freqüência ajustando o código.

Por favor, deixe-me saber se mais detalhes são necessários.

Obrigado e cumprimentos

VPV

Encontrou uma solução fácil (que funciona com 1.5.1 com certeza, mas talvez com versões anteriores também):

Submeta com o parâmetro --packages e coordenadas Maven, como:

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

Descrito em

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

Esse erro significa simplesmente que, no tempo de execução, a class TwitterUtils (ou no object scala language TwitterUtils) não é apresentada, no entanto, em tempo de compilation, é apresentada (porque senão você não poderá construir com maven). Você deve se certificar de que o arquivo jar que você criou de fato contenha essa class / object. Você pode simplesmente descompactar o arquivo jar para ver o que realmente está incluído. O mais provável é que o seu arquivo de compilation maven use a dependência para construir o projeto, mas não o inclua no seu jar final.

Tente fazer assim …

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

consumidorsecretário de accessaccess

  **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