SparkContext.addJar在本地模式下不起作用

时间:2017-03-22 22:52:57

标签: apache-spark

当火花作业需要一个jar文件时,需要通过两种方式将其添加到spark作业中:
1. width选项命令。
2. --jar path
谁能告诉我这两种方式之间的区别?
来自this question,答案是它们是相同的,只有优先级不同,但我不认为这是真的。如果我以纱线群集模式提交spark作业,则如果根据official site命令中的选项SparkContext.addJar("path")中未包含jar文件,则addJar()将无效。

  

--jars选项允许SparkContext.addJar函数工作   您正在使用本地文件并以纱线群集模式运行。它   如果您使用HDFS,HTTP,HTTPS,则无需使用   或FTP文件。

原因是驱动程序运行在与客户端不同的机器上。因此,命令中的选项--jars似乎来自客户端,而函数--jars只能用于驱动程序中的jar。

然后我在本地模式下进行了测试。

1。addJar()

如果我以这种方式启动spark-shell,jar中的对象可以在spark-shell中使用

2。spark-shell --master local --jars path/to/jar

如果我以这种方式启动spark-shell并使用spark-shell --master local,则jar文件中的对象无法导入spark-shell,并且出现sc.addJar("path/to/jar")错误。

我的问题是:

为什么方法class cannot be found在本地模式下不起作用?

SparkContext.addJar()SparkContext.addJar()之间有什么区别?

我的环境:hortonworks 2.5集群和spark的版本是1.6.2。我很感激,如果有人能够对此有所了解。

1 个答案:

答案 0 :(得分:3)

嗯,经过一番研究,我发现了原因。如果有其他人参与此问题,请在此处发布。

方法addJar()不会将jar添加到驱动程序的类路径中。该方法的作用是在驱动程序节点中查找jar,分发到工作节点,然后添加到执行程序的类路径中 因为我以本地模式提交我的spark作业,所以在spark作业中使用了驱动程序类路径(我猜),无法找到方法addJar()添加的jar。

要解决此问题,请在提交火花作业时使用--jars选项包含所有广告,或使用--driver-class-path添加广告。
可以找到更多详细信息here