真正的…这已经被讨论了很多。

然而,这里有很多模棱两可的地方,并且提供了一些答案……包括在JAR /executor/driver配置或选项中复制JAR引用。

模糊的和/或省略的细节

对于每个选项,应澄清以下模糊、不清楚和/或省略的细节:

如何影响ClassPath 司机 执行程序(用于运行的任务) 这两个 一点也不 分隔字符:逗号、冒号、分号 如果提供的文件是自动分发的 对于任务(给每个执行程序) 用于远程驱动程序(如果在集群模式下运行) 接受的URI类型:本地文件,HDFS, HTTP等。 如果复制到一个公共位置,该位置在哪里(HDFS,本地?)

影响的选项:

——罐子 SparkContext.addJar(…)方法 SparkContext.addFile(…)方法 ——配置spark.driver.extraClassPath =…或者——driver-class-path… ——配置spark.driver.extraLibraryPath =…,或者——driver-library-path… ——配置spark.executor.extraClassPath =… ——配置spark.executor.extraLibraryPath =… 不要忘记,spark-submit的最后一个参数也是一个.jar文件。

我知道我可以在哪里找到Apache Spark的主要文档,特别是关于如何提交,可用的选项,以及JavaDoc。然而,这仍然给我留下了一些漏洞,尽管它也得到了部分回答。

我希望事情没有那么复杂,希望有人能给我一个清晰简明的答案。

如果我要从文档中猜测,似乎——jars、SparkContext addJar和addFile方法是自动分发文件的方法,而其他选项只是修改ClassPath。

为了简单起见,我可以同时使用这三个主要选项添加其他应用程序JAR文件,这样的假设是否安全?

spark-submit --jar additional1.jar,additional2.jar \
  --driver-library-path additional1.jar:additional2.jar \
  --conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

我在另一个帖子的答案上找到了一篇不错的文章。然而,什么也没学到。海报确实很好地说明了本地驱动程序(yarn-client)和远程驱动程序(yarn-cluster)之间的区别。记住这一点绝对很重要。


当前回答

使用——jars是有限制的:如果你想为jar/xml文件指定一个目录,它不允许目录扩展。这意味着您需要为每个JAR文件指定一个绝对路径。

如果你指定——driver-class-path并且你在yarn集群模式下执行,那么驱动类不会被更新。我们可以在Spark UI下或在tab环境下的Spark历史服务器下验证类路径是否被更新。

对我来说,传递包含目录扩展和在yarn集群模式下工作的JAR文件的选项是——conf选项。最好将驱动程序和执行器类路径作为——conf传递,这会将它们添加到Spark会话对象本身,并且这些路径会反映在Spark配置中。但是请确保将JAR文件放在整个集群的相同路径上。

spark-submit \
  --master yarn \
  --queue spark_queue \
  --deploy-mode cluster    \
  --num-executors 12 \
  --executor-memory 4g \
  --driver-memory 8g \
  --executor-cores 4 \
  --conf spark.ui.enabled=False \
  --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapred.output.dir=/tmp \
  --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

其他回答

我知道添加jar -jars选项会自动将它添加到类路径中。

https://spark.apache.org/docs/3.2.1/submitting-applications.html

该列表包含在驱动程序和执行程序类路径中。

在yarn as部署模式下,与JAR文件和类路径相关的其他可配置Spark选项如下。

在Spark文档中,

spark.yarn.jars 包含要分发到YARN容器的Spark代码的库列表。 默认情况下,YARN上的Spark将使用本地安装的Spark jar,但Spark jar也可以是本地安装的 在HDFS上一个世界可读的位置。这允许YARN将其缓存到节点上,这样就不会发生 需要在每次应用程序运行时分发。例如,要指向HDFS上的jar, 设置为hdfs:///some/path。glob是允许的。

spark.yarn.archive 一个包含所需Spark jar的归档文件,用于分发到YARN缓存。如果设置了,则 配置替换spark.yarn.jars和存档使用在所有 应用程序的容器。归档文件的根目录中应该包含jar文件。 与前面的选项一样,存档也可以托管在HDFS上,以加快文件的速度 分布。

用户可以配置这个参数来指定他们的JAR文件,这些文件会被包含在Spark驱动程序的类路径中。

当我们使用Spark -submit实用程序提交Apache Spark作业时,有一个选项——jars。使用这个选项,我们可以将JAR文件传递给Spark应用程序。

当使用spark-submit和——master yarn-cluster时,应用程序JAR文件以及包含在——jars选项中的任何JAR文件将自动传输到集群中。——jars后提供的url必须用逗号分隔。该列表包含在驱动程序和执行程序类路径中

例子:

spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar

参考

提交的应用程序

使用——jars是有限制的:如果你想为jar/xml文件指定一个目录,它不允许目录扩展。这意味着您需要为每个JAR文件指定一个绝对路径。

如果你指定——driver-class-path并且你在yarn集群模式下执行,那么驱动类不会被更新。我们可以在Spark UI下或在tab环境下的Spark历史服务器下验证类路径是否被更新。

对我来说,传递包含目录扩展和在yarn集群模式下工作的JAR文件的选项是——conf选项。最好将驱动程序和执行器类路径作为——conf传递,这会将它们添加到Spark会话对象本身,并且这些路径会反映在Spark配置中。但是请确保将JAR文件放在整个集群的相同路径上。

spark-submit \
  --master yarn \
  --queue spark_queue \
  --deploy-mode cluster    \
  --num-executors 12 \
  --executor-memory 4g \
  --driver-memory 8g \
  --executor-cores 4 \
  --conf spark.ui.enabled=False \
  --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapred.output.dir=/tmp \
  --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
  --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp