是的……已经讨论了很多。
但是,存在很多歧义,并且提供了一些答案……包括在 jars/executor/driver 配置或选项中复制 JAR 引用。
应为每个选项澄清以下歧义、不清楚和/或遗漏的细节:
--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=...
我知道在哪里可以找到主要的 Apache Spark 文档,特别是关于如何提交、可用选项以及JavaDoc的信息。然而,这给我留下了相当多的漏洞,尽管它也得到了部分回答。
我希望它不是那么复杂,并且有人可以给我一个清晰简洁的答案。
如果我从文档中猜测,似乎--jars, 和SparkContext addJar和addFile方法将自动分发文件,而其他选项仅修改 ClassPath。
SparkContext
addJar
addFile
假设为简单起见,我可以同时使用三个主要选项添加其他应用程序 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
ClassPath 会受到影响,具体取决于您提供的内容。有几种方法可以在类路径上设置一些东西:
spark.driver.extraClassPath``--driver-class-path
spark.executor.extraClassPath
如果您希望某个 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"
这取决于您运行作业的模式:
客户端模式 - Spark 启动Netty HTTP 服务器,该服务器在启动时为每个工作节点分发文件。当您开始 Spark 作业时,您可以看到:
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server 16/05/08 17:29:12 INFO Utils: Successfully started service ‘HTTP file server’ on port 58922. 16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732 16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
集群模式 - 在集群模式下,Spark 选择了一个领导 Worker 节点来执行 Driver 进程。这意味着作业不是直接从 主 节点运行的。在这里,Spark 不会 设置 HTTP 服务器。您必须通过 HDFS、S3 或其他可用于所有节点的源手动使您的 JAR 文件可用于所有工作节点。
在“提交应用程序”中,Spark 文档很好地解释了文件可接受的前缀:
使用 spark-submit 时,应用程序 jar 以及包含在 –jars 选项中的任何 jar 将自动传输到集群。Spark 使用以下 URL 方案来允许传播 jar 的不同策略: file: - 绝对路径和 file:/ URI 由驱动程序的 HTTP 文件服务器提供服务,每个执行程序从驱动程序 HTTP 服务器拉取文件。 hdfs:, http:, https:, ftp: - 这些从 URI 中按预期下拉文件和 JAR local: - 以 local:/ 开头的 URI 应作为本地文件存在于每个工作节点上。这意味着不会产生网络 IO,并且适用于推送给每个工作人员或通过 NFS、GlusterFS 等共享的大型文件/JAR。 请注意,JAR 和文件将复制到执行程序节点上每个 SparkContext 的工作目录。
使用 spark-submit 时,应用程序 jar 以及包含在 –jars 选项中的任何 jar 将自动传输到集群。Spark 使用以下 URL 方案来允许传播 jar 的不同策略:
请注意,JAR 和文件将复制到执行程序节点上每个 SparkContext 的工作目录。
如前所述,JAR 文件被复制到每个 Worker 节点的 工作目录中。 那具体在哪里?它 通常 在 下,你会看到它们是这样的: /var/run/spark/work
/var/run/spark/work
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027 drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028 drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029 drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030 drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031 drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032 drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
当您查看内部时,您会看到您部署的所有 JAR 文件:
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/ [*@*]$ ll total 89988 -rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar -rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar -rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar -rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar -rw-r--r-- 1 spark spark 457 May 8 17:34 stderr -rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
最重要的是要了解 优先级 。如果您通过代码传递任何属性,它将优先于您通过 指定的任何选项spark-submit。Spark 文档中提到了这一点:
spark-submit
任何指定为标志或属性文件中的值都将传递给应用程序并与通过 SparkConf 指定的值合并。 直接在 SparkConf 上设置的属性具有最高优先级 ,然后是传递给 spark-submit 或 spark-shell 的标志,然后是 spark- defaults.conf 文件中的选项
因此,请确保将这些值设置在适当的位置,这样当一个优先于另一个时,您就不会感到惊讶。
让我们来分析问题中的每个选项:
SparkContext.addJar
extraClassPath
SparkContext.addFile
--driver-class-path
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
--conf spark.executor.extraLibraryPath=...``java.library.path
可以安全地假设为简单起见,我可以同时使用 3 个主要选项添加其他应用程序 jar 文件:
您可以放心地假设这仅适用于 客户端 模式,而不适用于 集群 模式。正如我之前所说。此外,您给出的示例有一些多余的论点。例如,将 JAR 文件传递给--driver-library- path是没有用的。extraClassPath如果您希望它们在您的类路径中,则需要将它们传递给。最终,当您在驱动程序和工作程序上部署外部 JAR 文件时,您需要:
--driver-library- path
spark-submit --jars additional1.jar,additional2.jar \ --driver-class-path additional1.jar:additional2.jar \ --conf spark.executor.extraClassPath=additional1.jar:additional2.jar \ --class MyClass main-application.jar