是的……已经讨论了很多。
但是,存在很多歧义,并且提供了一些答案……包括在 jars/executor/driver 配置或选项中复制 JAR 引用。
模棱两可和/或遗漏的细节
应为每个选项澄清以下歧义、不清楚和/或遗漏的细节:
- ClassPath 如何受到影响
- 司机
- 执行器(用于正在运行的任务)
- 两个都
- 一点也不
- 分隔符:逗号、冒号、分号
- 如果提供的文件是自动分发的
- 对于任务(对每个执行者)
- 对于远程驱动程序(如果在集群模式下运行)
- 接受的 URI 类型:本地文件、 HDFS 、HTTP 等。
- 如果复制 到 一个公共位置,该位置在哪里(HDFS,本地?)
它影响的选项:
--jars
SparkContext.addJar(...)
方法SparkContext.addFile(...)
方法--conf spark.driver.extraClassPath=...
或--driver-class-path ...
--conf spark.driver.extraLibraryPath=...
或--driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
- 不要忘记,spark-submit 的最后一个参数也是一个 .jar 文件。
我知道在哪里可以找到 主要的 Apache Spark 文档,特别是关于 如何提交、可用 选项 以及 JavaDoc 的信息。然而,这给我留下了相当多的漏洞,尽管它也得到了部分答案。
我希望它不是那么复杂,并且有人可以给我一个清晰简洁的答案。
If I were to guess from documentation, it seems that --jars
, and the SparkContext
addJar
and addFile
methods are the ones that will automatically分发文件,而其他选项仅修改 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)之间的区别做了很好的评论。牢记这一点绝对很重要。
原文由 YoYo 发布,翻译遵循 CC BY-SA 4.0 许可协议
类路径:
ClassPath 会受到影响,具体取决于您提供的内容。有几种方法可以在类路径上设置一些东西:
spark.driver.extraClassPath
或者它的别名--driver-class-path
在运行驱动的节点上设置额外的类路径。spark.executor.extraClassPath
在 Worker 节点上设置额外的类路径。如果您希望某个 JAR 同时作用于 Master 和 Worker,则必须在 BOTH 标志中分别指定它们。
分隔符:
遵循与 JVM 相同的规则:
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
;
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
文件分发:
这取决于您运行作业的模式:
接受的文件 URI
在 “提交应用程序” 中,Spark 文档很好地解释了文件可接受的前缀:
如前所述,JAR 文件被复制到每个 Worker 节点的 工作目录 中。那具体在哪里?它 通常 在
/var/run/spark/work
下,你会看到它们是这样的:当您查看内部时,您会看到您部署的所有 JAR 文件:
受影响的选项:
最重要的是要了解 优先级。如果您通过代码传递任何属性,它将优先于您通过
spark-submit
指定的任何选项。 Spark 文档中提到了这一点:因此,请确保将这些值设置在适当的位置,这样当一个优先于另一个时,您就不会感到惊讶。
让我们分析问题中的每个选项:
--jars
vsSparkContext.addJar
:这些是相同的。只有一个是通过 Spark 提交设置的,一个是通过代码设置的。选择一个更适合你的。需要注意的重要一点是,使用这些选项中的任何一个 都不会将 JAR 文件添加到您的驱动程序/执行程序类路径 中。您需要在两者上使用extraClassPath
配置显式添加它们。SparkContext.addJar
vsSparkContext.addFile
:当您的代码有 依赖 项时,请使用前者。当您只想将任意文件传递给工作节点时使用后者,这不是代码中的运行时依赖项。--conf spark.driver.extraClassPath=...
或--driver-class-path
:这些是别名,你选择哪一个并不重要--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
同上,别名。--conf spark.executor.extraClassPath=...
:当您有一个无法包含在 über JAR 中的依赖项(例如,因为库版本之间存在编译时冲突)并且您需要在运行时加载时使用此选项。--conf spark.executor.extraLibraryPath=...
这作为 JVM 的java.library.path
选项传递。当您需要对 JVM 可见的库路径时使用此选项。您可以放心地假设这仅适用于 客户端 模式,而不适用于 集群 模式。正如我之前所说。此外,您给出的示例有一些多余的论点。例如,将 JAR 文件传递给
--driver-library-path
是没有用的。如果您希望它们在您的类路径中,您需要将它们传递给extraClassPath
。最终,当您在驱动程序和工作程序上部署外部 JAR 文件时,您需要: