ClassPath:
类路径会受到影响,具体取决于您提供的内容.有几种方法可以在类路径上设置某些内容:
spark.driver.extraClassPath
或alias --driver-class-path
在运行驱动程序的 node 上设置额外的类路径.
spark.executor.extraClassPath
在工作 node 上设置额外的类路径.
如果您希望某个JAR同时作用于Master和Worker,则必须在这两个标志中分别指定它们.
分离字符:
Following the same rules as the JVM:
- Linux: A colon,
:
- e、 g:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: A semicolon,
;
- e、 g:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
文件分发:
这取决于您运行作业(job)时使用的模式:
客户端模式-Spark启动一个Netty HTTP服务器,该服务器在启动时 for each 工作 node 分发文件.你可以看到,当你开始你的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 Select 了一个leader Worker node 来执行Driver进程.这意味着作业(job)不是直接从Master node 运行的.这里,Spark will not设置了一个HTTP服务器.您必须通过HDFS、S3或所有 node 都可用的其他源手动使所有工作 node 都可以使用JAR文件.
文件的已接受URI
在"Submitting Applications"中,Spark文档很好地解释了可接受的文件前缀:
使用spark submit时,应用程序jar会与任何jar一起使用
- file:-绝对路径和file:/URI由驱动程序的HTTP提供服务
文件服务器,并且每个执行器从驱动程序HTTP拉取文件
服务器.
- hdfs:、http:、https:、ftp:-这些下拉文件和JAR
- local:-以local:/is开头的URI
预计在每个工作 node 上作为本地文件存在.这意味着
不会产生网络IO,并且适用于大文件/JAR
推送到每个工作进程,或通过NFS、GlusterFS等共享.
请注意,JAR和文件将分别复制到工作目录中
执行器 node 上的SparkContext.
如前所述,每个Worker node 的JAR文件都会复制到working directory.那到底在哪里?/var/run/spark/work
下usually,你会看到他们这样:
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
受影响的选项:
最重要的是要理解priority.如果通过代码传递任何属性,它将优先于通过spark-submit
指定的任何选项.Spark文档中提到了这一点:
将传递属性文件中指定为标志或的任何值
添加到应用程序上,并与通过
SparkConf.然后将标志传递给电光提交或电光shell ,然后
电光-defaults.conf文件中的选项
因此,请确保将这些值设置在适当的位置,这样当一个值优先于另一个值时,您就不会感到惊讶.
让我们分析问题中的每个选项:
--jars
对SparkContext.addJar
:这些是一样的.只有一个是通过电光提交设置的,一个是通过代码设置的.选一件更适合你的.需要注意的重要一点是,使用这两个选项does not add the JAR file to your driver/executor classpath中的任一个.您需要在两者上使用extraClassPath
配置显式添加它们.
SparkContext.addJar
vs SparkContext.addFile
:当您的代码需要使用dependency时,请使用前者.当您只想将任意文件传递给工作 node 时,可以使用后者,这在代码中不是运行时依赖项.
--conf spark.driver.extraClassPath=...
或--driver-class-path
:这些是别名,你 Select 哪一个无关紧要
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
同上,别名.
--conf spark.executor.extraClassPath=...
:当您有一个依赖项不能包含在über JAR中(例如,因为库版本之间存在编译时冲突)并且需要在运行时加载时,请使用此选项.
--conf spark.executor.extraLibraryPath=...
这将作为JVM的java.library.path
选项传递.当需要JVM可见的库路径时,请使用此选项.
为了简单起见,我可以添加额外的
你可以放心地假设这只适用于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