当火花作业需要一个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。我很感激,如果有人能够对此有所了解。
答案 0 :(得分:3)
嗯,经过一番研究,我发现了原因。如果有其他人参与此问题,请在此处发布。
方法addJar()
不会将jar添加到驱动程序的类路径中。该方法的作用是在驱动程序节点中查找jar,分发到工作节点,然后添加到执行程序的类路径中
因为我以本地模式提交我的spark作业,所以在spark作业中使用了驱动程序类路径(我猜),无法找到方法addJar()
添加的jar。
要解决此问题,请在提交火花作业时使用--jars
选项包含所有广告,或使用--driver-class-path
添加广告。
可以找到更多详细信息here。