Add JAR files to a Spark job - spark-submit(将JAR文件添加到电光作业-电光-提交)
问题描述
正确.这件事已经讨论了很多。 然而,有很多模棱两可的地方,并且提供了一些答案……包括在JARS/Executor/Driver配置或选项中复制JAR引用。
不明确和/或省略的详细信息
每个选项都应澄清以下不明确、不清楚和/或遗漏的详细信息:
- 如何影响ClassPath
- 驱动程序
- 执行器(用于任务运行)
- 两者都
- 完全没有
- 分隔符:逗号、冒号、分号
- 如果自动分发提供的文件
- 任务(发送给每个执行者)
- 用于远程驱动程序(如果在群集模式下运行)
- 接受的URI类型:本地文件、HDFS、HTTP等
- 如果将复制到公共位置,则该位置是(HDFS,LOCAL?)
影响的选项:
--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=...
- 别忘了,电光提交的最后一个参数也是.jar文件。
我知道在哪里可以找到main Apache Spark documentation,特别是关于how to submit、可用的options和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
我在an answer to another posting上找到了一篇不错的文章。然而,没有学到任何新的东西。这篇帖子确实很好地说明了本地驱动程序(yer-client)和远程驱动程序(yer-cluster)之间的区别。记住这一点绝对重要。
推荐答案
类路径:
ClassPath会受到影响,具体取决于您提供的内容。有几种方法可以在类路径上设置内容:spark.driver.extraClassPath
或其别名--driver-class-path
在运行驱动程序的节点上设置额外的类路径。spark.executor.extraClassPath
在工作节点上设置额外的类路径。
如果您希望某个JAR同时影响Master和Worker,则必须在这两个标志中分别指定它们。
分隔符:
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"
- 例如:
文件分发:
这取决于您运行作业的模式:
客户端模式-电光启动一个NettyHTTP服务器,该服务器在启动时为每个工作节点分发文件。您可以在开始电光作业时看到这一点:
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
群集模式-在群集模式下,电光选择要在其上执行驱动程序进程的领导工作者节点。这意味着作业没有直接从Master节点运行。在这里,电光不会设置http服务器。您必须通过HDFS、S3或所有节点可用的其他源手动使您的JAR文件可供所有工作节点使用。
接受的文件URI
在"Submitting Applications"中,电光文档很好地解释了可接受的文件前缀:
使用电光提交时,应用程序和任何JAR都是JAR 包括在--jars选项中的文件将自动传输到 群集。电光使用以下网址方案来允许不同的 广播罐的策略:
- file:-绝对路径和file:/URI由驱动程序的HTTP提供服务 文件服务器,并且每个执行器从驱动程序HTTP拉取文件 服务器。
- hdfs:,http:,https:,ftp:-这些下拉文件和JAR 如预期的那样从URI
- local:-以local:/is开头的URI 预计在每个工作节点上作为本地文件存在。这意味着 不会产生网络IO,并且适用于大文件/JAR 推送到每个工作进程,或通过NFS、GlusterFS等共享。
请注意,JAR和文件将分别复制到工作目录 执行器节点上的SparkContext。如前所述,JAR文件被复制到每个工作器节点的工作目录。那到底在哪里?通常是在
/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
指定的任何选项。电光文档中提到了这一点:将传递属性文件中指定为标志或的任何值 添加到应用程序上,并与通过 SparkConf.直接在SparkConf上设置的属性取值最高 优先级,然后将标志传递给电光提交或电光外壳,然后 电光-defaults.conf文件中的选项因此,请确保将这些值设置在正确的位置,这样当其中一个值优先于另一个值时,您不会感到意外。
让我们分析一下问题中的每个选项:
--jars
vsSparkContext.addJar
:它们是相同的。只有一个是通过电光提交设置的,一个是通过代码设置的。选一件更适合你的。需要注意的一点是,使用这两个选项中的任何一个都不会将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可见的库路径时,请使用此选项。为简单起见,我可以添加其他 同时使用3个主要选项的应用程序JAR文件:您可以安全地假定这仅适用于客户端模式,而不适用于群集模式。正如我之前说过的。另外,你举的例子有一些多余的论据。例如,将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
这篇关于将JAR文件添加到电光作业-电光-提交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将JAR文件添加到电光作业-电光-提交
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01