类路径:
ClassPath 会受到影响,具体取决于您提供的内容。有几种方法可以在类路径上设置一些东西:
-
spark.driver.extraClassPath 或别名 --driver-class-path 用于在运行驱动程序的节点上设置额外的类路径。
-
spark.executor.extraClassPath 在 Worker 节点上设置额外的类路径。
如果您希望某个 JAR 同时作用于 Master 和 Worker,则必须在 BOTH 标志中分别指定这些。
分隔符:
Following the same rules as the JVM:
- Linux:冒号,
:
- 例如:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows:分号,
;
- 例如:
--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 进程。这意味着作业不是直接从 Master 节点运行的。在这里,Spark 不会设置 HTTP 服务器。您必须通过 HDFS、S3 或其他可用于所有节点的源手动使您的 JAR 文件可用于所有工作节点。
已接受的文件 URI
在"Submitting Applications" 中,Spark 文档很好地解释了可接受的文件前缀:
使用 spark-submit 时,应用程序 jar 以及任何 jar
包含在 --jars 选项中的将自动转移到
集群。 Spark 使用以下 URL 方案来允许不同的
传播罐子的策略:
- file: - 绝对路径和 file:/ URI 由驱动程序的 HTTP 提供
文件服务器,每个执行程序从驱动程序 HTTP 拉文件
服务器。
- hdfs:, http:, https:, ftp: - 这些下拉文件和 JAR
来自 URI 的预期
- local: - 以 local:/ 开头的 URI
期望作为本地文件存在于每个工作节点上。这意味着
不会产生网络 IO,并且适用于大文件/JAR
推送给每个工作人员,或通过 NFS、GlusterFS 等共享。
请注意,每个 JAR 文件和文件都会复制到工作目录中
执行器节点上的 SparkContext。
如上所述,JAR 文件被复制到每个 Worker 节点的工作目录。那具体在哪里?它通常在/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 文档中提到了这一点:
任何指定为标志或属性文件中的值都将被传递
在应用程序上并与通过指定的应用程序合并
火花会议。 直接在 SparkConf 上设置的属性最高
优先级,然后将标志传递给 spark-submit 或 spark-shell,然后
spark-defaults.conf 文件中的选项
因此,请确保将这些值设置在适当的位置,这样当一个优先于另一个时,您不会感到惊讶。
让我们分析问题中的每个选项:
-
--jars vs SparkContext.addJar:它们是相同的。只有一个是通过 Spark 提交设置的,一个是通过代码设置的。选择一个更适合你的。需要注意的重要一点是,使用这些选项中的任何一个不会将 JAR 文件添加到您的驱动程序/执行程序类路径。您需要在两者上使用 extraClassPath 配置显式添加它们。
-
SparkContext.addJar vs SparkContext.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 可见的库路径时,请使用此选项。
是否可以安全地假设为简单起见,我可以添加额外的
同时使用 3 个主要选项的应用程序 jar 文件:
您可以放心地假设这仅适用于 Client 模式,而不适用于 Cluster 模式。正如我之前所说。此外,您给出的示例有一些多余的论点。例如,将 JAR 文件传递给 --driver-library-path 是没有用的。如果您希望它们位于您的类路径中,则需要将它们传递给 extraClassPath。最终,当您在驱动程序和工作程序上部署外部 JAR 文件时,您希望:
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