Obtenir un pot n'existe pas et java.lang.ClassNotFoundException lors de l'exécution d'un simple code d'analyse des sentiments Twitter
Je me bats avec cela depuis un certain temps maintenant. J'ai essayé d'exécuter un simple code d'analyse des sentiments Twitter qui semblait bien fonctionner plus tôt mais ne fonctionne plus. J'utilise spark 1.3.1 avec scala 2.10.4. J'ai lu quelque part que TwitterUtils ne fonctionne pas avec spark 1.0+, j'ai donc essayé une solution de contournement. Tout semble être en place, selon les livres..la bonne structure de répertoire pour scala, un gros pot utilisant l'assemblage sbt, les bons chemins mais spark est incapable de le faire ramassez le fichier jar et j'obtiens également une ClassNotFoundException avec lui.
Qu'est-ce qui pourrait mal tourner et comment puis-je le réparer?
MODIFIER:
La ligne de commande
../bin/spark-soumettre --classe Sentimenter --master locales[4] /home/ubuntu/spark/spark_examples/cible/scala-2.10/twitter-sentiment-assemblage-1.0.jar
L'erreur:
Warning: Local jar /home/ubuntu/spark/spark_examples/target/scala-2.10/twitter-sentiment-assembly-1.0.jar does not exist, skipping.
java.lang.ClassNotFoundException: Sentimenter
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)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:538)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
La construction.fichier sbt:
lazy val root = (project in file(".")).
settings(
name := "twitter-sentiment",
version := "1.0",
scalaVersion := "2.10.4",
mainClass in Compile := Some("Sentimenter")
)
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "1.3.1" % "provided",
"org.apache.spark" %% "spark-streaming" % "1.3.1" % "provided",
"org.apache.spark" % "spark-streaming-twitter_2.11" % "1.3.1"
)
// META-INF discarding
val meta = """META.INF(.)*""".r
assemblyMergeStrategy in assembly := {
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
case n if n.startsWith("reference.conf") => MergeStrategy.concat
case n if n.endsWith(".conf") => MergeStrategy.concat
case meta(_) => MergeStrategy.discard
case x => MergeStrategy.first`
Et voici le code que j'ai obtenu d'un autre forum sur twitter le sentiment
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
object Sentimenter {
def main(args: Array[String]) {
System.setProperty("twitter4j.oauth.consumerKey","xxxxxxxxxxxxx");
System.setProperty("twitter4j.oauth.consumerSecret","xxxxxxxxxxxx");
System.setProperty("twitter4j.oauth.accessToken","xxxxxxxxxxxx");
System.setProperty("twitter4j.oauth.accessTokenSecret","xxxxxxxxxx");
val filters = new Array[String](2)
filters(0) = "Big Data"
filters(1) = "geofencing"
val sparkConf = new SparkConf().setAppName("TweetSentiment").setMaster("local[4]").set("spark.driver.allowMultipleContexts", "true")
val sc = new SparkContext(sparkConf)
// get the list of positive words
val pos_list = sc.textFile("/home/ubuntu/spark/src/main/scala/Positive_Words.txt") //Random
.filter(line => !line.isEmpty())
.collect()
.toSet
// get the list of negative words
val neg_list = sc.textFile("/home/ubuntu/spark/src/main/scala/Negative_Words.txt") //Random
.filter(line => !line.isEmpty())
.collect()
.toSet
// create twitter stream
val ssc = new StreamingContext(sparkConf, Seconds(5))
val stream = TwitterUtils.createStream(ssc, None, filters)
val tweets = stream.map(r => r.getText)
tweets.print() // print tweet text
ssc.start()
ssc.awaitTermination()
}
}
2 answers
Je pense que si vous écrivez
../bin/spark-submit --class Sentimenter --master local[4] --jars /home/ubuntu/spark/spark_examples/target/scala-2.10/twitter-sentiment-assembly-1.0.jar
Ou essayez de réorganiser les drapeaux dans le spark-submit, par exemple:
../bin/spark-submit --jars /home/ubuntu/spark/spark_examples/target/scala-2.10/twitter-sentiment-assembly-1.0.jar --master local[4] --class Sentimenter
Vous pourriez le faire fonctionner.
À mon avis, c'est probablement parce que spark ne parvient pas à accéder à votre fichier jar. Essayez de déplacer le fichier jar hors de votre répertoire personnel. Il fonctionne pour moi.