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

Fra*_*kie 3 apache-spark

当spark作业中需要有jar文件时,需要通过两种方式添加到spark作业中:
1.--jar path命令中的选项。
2 SparkContext.addJar("path")..
谁能告诉我这两种方式之间的区别?
这个问题来看,答案是它们是相同的,只是优先级不同,但我认为这不是真的。--jars如果我在纱线集群模式下提交 Spark 作业,根据官方网站,如果命令中的选项中未包含 jar 文件,则 addJar() 将无法工作。

如果您将 SparkContext.addJar 函数与本地文件一起使用并在纱线集群模式下运行,则 --jars 选项允许 SparkContext.addJar 函数工作。如果您将其与 HDFS、HTTP、HTTPS 或 FTP 文件一起使用,则不需要使用它。

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

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

1.spark-shell --master local --jars path/to/jar

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

2.spark-shell --master local

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

我的问题是:

为什么该方法SparkContext.addJar()在本地模式下不起作用?

SparkContext.addJar()和 和有什么区别--jars

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

Fra*_*kie 6

嗯,经过一番研究,我找到了原因。如果还有其他人涉及此问题,请在此处发帖。

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

为了解决这个问题,--jars在提交spark作业时使用包含所有jar的选项或使用--driver-class-path添加jar。更多详情可在这
找到。