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
找到一个简单的解决方案(当然可以使用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
这个错误仅仅意味着在运行时 TwitterUtils 类(或在 scala 语言中的 TwitterUtils 对象)不存在,但是在编译时它存在(因为否则你将无法使用 maven 构建)。您应该确保您创建的 jar 文件确实包含该类/对象。您只需解压缩该 jar 文件即可查看实际包含的内容。您的 Maven 构建文件很可能使用依赖项来构建项目,但最终不会将其包含在最终的 jar 中。
| 归档时间: |
|
| 查看次数: |
31904 次 |
| 最近记录: |