【问题标题】:SparkContext.addJar does not work in local modeSparkContext.addJar 在本地模式下不起作用
【发布时间】:2017-08-15 07:17:56
【问题描述】:

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

--jars 选项允许 SparkContext.addJar 函数在以下情况下工作 您正在将它与本地文件一起使用并在 yarn-cluster 模式下运行。它 如果与 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。如果有人能对此有所了解,我将不胜感激。

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2019-07-12
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多