运行TwitterPopularTags时java.lang.NoClassDefFoundError:org/apache/spark/streaming/twitter/TwitterUtils $

vpv*_*vpv 17 scala noclassdeffounderror maven apache-spark spark-streaming

我是Spark streaming和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
Run Code Online (Sandbox Code Playgroud)

我添加了以下依赖项Spark-streaming_2.10:1.1.0 Spark-core_2.10:1.1.0 Spark-streaming-twitter_2.10:1.1.0

我甚至尝试过1.2.0 for Spark-streaming-twitter,但这也给了我同样的错误.

我在这里先向您的帮助表示感谢.

问候,vpv

vpv*_*vpv 15

感谢您提出建议.我只能通过使用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语句

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
Run Code Online (Sandbox Code Playgroud)

3)在此之后,使用以下名称在父文件夹下创建另一个文件夹

Twitter的/项目

并创建一个名为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")
Run Code Online (Sandbox Code Playgroud)

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/"
Run Code Online (Sandbox Code Playgroud)

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

sbt assembly
Run Code Online (Sandbox Code Playgroud)

这将下载依赖项并创建我们需要的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 
Run Code Online (Sandbox Code Playgroud)

8)这将输出打印到控制台,以便监视输出,最好通过调整代码来降低频率.

如果需要更多详细信息,请与我们联系.

感谢和问候,

VPV


Mar*_*dek 8

找到一个简单的解决方案(当然可以使用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}
Run Code Online (Sandbox Code Playgroud)

描述于

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


hex*_*nny 2

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