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

然而,这里有很多模棱两可的地方,并且提供了一些答案……包括在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

其他回答

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

使用——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

当使用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

参考

提交的应用程序

Apache Spark 2.1.0中的另一种方法是使用——conf Spark .driver。在spark-submit期间userClassPathFirst=true,这会改变依赖加载的优先级,从而改变spark-job的行为,通过赋予用户使用——jars选项添加到类路径中的JAR文件优先级。

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

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

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