Maven Spark standalone可以访问哪些JAR?何时需要通过SparkContext构造函数提供JAR?

Maven Spark standalone可以访问哪些JAR?何时需要通过SparkContext构造函数提供JAR?,maven,jar,apache-spark,spark-streaming,Maven,Jar,Apache Spark,Spark Streaming,我使用Spark Streaming连接到Twitter示例api,并检索我收到的推文文本。SparkContext在我的本地计算机上独立运行 JavaStreamingContext ssc = new JavaStreamingContext( "spark://[my network IP address]:7077", "StreamingTest", new Duration(1000), System.getenv("SPARK_PREFIX"

我使用Spark Streaming连接到Twitter示例api,并检索我收到的推文文本。SparkContext在我的本地计算机上独立运行

    JavaStreamingContext ssc = new JavaStreamingContext(
        "spark://[my network IP address]:7077", "StreamingTest",
        new Duration(1000), System.getenv("SPARK_PREFIX"), new String[]{...});
我有本地编译和运行代码所需的所有JAR,但是当我在从流式上下文派生的AjavaReceiveInputStream上调用.forEachRDDnew Function2{…}时,我得到一个

    java.lang.ClassNotFoundException: [my package].[my class]$1$1
它引用提供给.forEachRDD的匿名类

我通过将项目打包到一个jar中并将其作为SparkStreamingContext构造函数的参数来解决这个问题,但出于以下几个原因,这似乎有些奇怪:

Spark并不抱怨我导入到项目中的其他JAR,比如作为Maven依赖项添加的Twitter4J,因此它必须具有对某些JAR的固有访问权, 对项目进行打包,使其能够传递给Spark,这似乎太像是一种变通方法——必须有一个更优雅的解决方案, 每次运行代码时,都会在Spark目录中创建jar的新副本。 我如何确定Spark群集可以访问哪些JAR,以及何时有必要/良好的做法直接向SparkContext构造函数提供JAR


谢谢

如果您的项目依赖于第三方JAR,那么在将程序提交到集群中时,需要将它们作为逗号分隔的列表包含进来。在提交到集群之前,需要将源代码绑定到jar文件中

假设您的项目结构如下所示

simpleapp
- src/main/java
   - org.apache.spark.examples
     -SimpleApp.java
- lib
  - dependent.jars (you can put all dependent jars inside lib   directory)
- target
   - simpleapp.jar (after compiling your source)
所以你可以使用下面的命令

spark-submit --jars $(echo lib/*.jar | tr ' ' ',' ) --class org.apache.spark.examples.SimpleApp --master local[2]  target/simpleapp.jar
此外,您可以使用spark web控制台查看jar发行版,请转到您的程序->环境


嗨,Harsha,[主url]:4040/environment/WebUI对于调试非常方便。注意:作业必须运行4040页才能显示任何内容,而不仅仅是Spark master/workers,这是我以前关注的问题。我可以确认,当我使用您的命令运行我的应用程序时,与从eclipse运行应用程序时相比,有一个不同的env。eclipse有更多的env,并且它们大部分是作为系统类路径而不是由用户添加的,就像直接添加JAR一样。使用web ui,我可以确认我的应用程序查找的类在类路径的jar中,但我仍然得到异常。。。