Maven Spark standalone可以访问哪些JAR?何时需要通过SparkContext构造函数提供JAR?
我使用Spark Streaming连接到Twitter示例api,并检索我收到的推文文本。SparkContext在我的本地计算机上独立运行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"
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中,但我仍然得到异常。。。