我是spark streaming和scala的初学者。对于一个项目需求,我试图运行github中的twitterpoulartags示例。由于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
我添加了以下依赖项spark-streaming\u2.10:1.1.0 spark-core\u2.10:1.1.0 spark-streaming-twitter\u2.10:1.1.0
我甚至尝试了spark streaming twitter的1.2.0版本,但这也给了我同样的错误。
提前谢谢你的帮助。
你好,副总裁
7条答案
按热度按时间r7knjye21#
找到了一个简单的解决方案(当然可以与1.5.1一起使用,但也可以与早期版本一起使用):
提交
--packages
参数和maven坐标,如:描述于
http://spark.apache.org/docs/latest/programming-guide.html#using-贝壳
but5z9lq2#
试着这样做。。。
comsumerkey ConsumerCret accesstoken accesssecret用户密钥
olhwl3o23#
要在jar中包含依赖项,您需要指示maven构建一个“胖jar”。“fatjar”是一个jar,它不仅包含项目的.class文件,还包含所有必需的依赖项(这就是sbt assembly所做的)。默认的maven行为是将项目视为库,因此只使用.class文件构建jar。
下面是一个简单的maven pom,它可以做您想做的事情,注意我已经包括了一些其他常见的spark+maven行为,例如使用scala,但是最相关的部分在下面:
注意**如果您是通过spark而不是yarn提交作业,那么请取消对
<scope>provided</scope>
线z4bn682m4#
谢谢你的建议。我只能通过使用sbt组装来解决这个问题。下面是关于我是如何做到这一点的细节。
spark-已经存在于cloudera vm scala中-不确定是否存在于cloudera中,如果没有,我们可以安装它sbt-这也需要安装。我在本地机器上进行了两次安装,并将jar传输到vm。为了安装这个,我使用了以下链接
https://gist.github.com/visenger/5496675
1) 一旦所有这些都被创建。我们必须为我们的项目创建父文件夹。我创建了一个名为twitter的文件夹。
2) 创建另一个具有以下结构的文件夹twitter/src/main/scala,并在此文件夹中创建名为twitterpoulartags.scala的.scala文件。这与我们从github获得的代码略有不同。我不得不更改进口报表
3) 在此之后,在父文件夹下用以下名称创建另一个文件夹
twitter/项目
并创建一个名为assembly.sbt的文件。这有程序集插件的路径。以下是文件中的完整代码。
4) 创建了以上两个之后,在项目的父目录(twitter)中创建一个名为build.sbt的文件。在这里,我们需要提供需要创建的.jar文件的名称以及依赖项。请注意,即使文件中的代码之间的空行也很重要。
5) 最后,我们必须打开终端并转到项目的父文件夹(twitter)。从这里输入以下命令:
这将下载依赖项并创建我们需要的jar文件。
6) 为了运行该程序,我们需要在我们的id下创建一个twitter应用程序,并提供身份验证令牌和其他详细信息。下面的链接中提供了有关如何创建此文件的详细步骤。
http://ampcamp.berkeley.edu/3/exercises/realtime-processing-with-spark-streaming.html
7) 一旦我们完成了上述所有操作,我们就可以使用vm中的spark submit命令来运行作业。命令示例为
8) 这会将输出打印到控制台,以便监视输出,最好通过调整代码来降低频率。
如果需要更多的细节,请告诉我。
谢谢和问候,
vpv公司
kulphzqa5#
我也面临同样的问题,通过从sbt中删除“provided”来解决它。
hfsqlsce6#
2ekbmq327#
这个错误仅仅意味着在运行时twitterutils类(或者scala语言中的twitterutils对象)没有出现,但是在编译时出现了它(因为否则您将无法使用maven构建)。您应该确保您创建的jar文件确实包含该类/对象。您可以简单地解压缩jar文件以查看实际包含的内容。maven构建文件很可能使用依赖关系来构建项目,但最终不会将其包含在最终的jar中。