没错...这件事已经讨论了很多.

然而,这里有很多模棱两可的地方,并且提供了一些答案...包括在jars/executor/driver配置或选项中复制JAR引用.

模棱两可和/或省略的细节

对于每个选项,应澄清以下模糊、不清楚和/或遗漏的细节:

  • 类路径如何受到影响
  • 分隔字符:逗号、冒号、分号
  • If provided files are automatically distributed
    • 对于任务(给每个执行者)
    • for the remote 驾驶员 (if ran in cluster mode)
  • 接受的URI类型:本地文件、HDFS、HTTP等.
  • 如果复制into公共位置,则该位置在哪里(HDFS,本地?)

它影响的选项:

  1. --jars
  2. SparkContext.addJar(...)
  3. SparkContext.addFile(...)方法
  4. --conf spark.driver.extraClassPath=...--driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=...--driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. 不要忘记,spark submit的最后一个参数也是.jar文件.

我知道我在哪里可以找到main Apache Spark documentation个,特别是大约how to submit个,可用的options个,还有JavaDoc个.然而,这给我留下了相当多的漏洞,尽管它也得到了部分回答.

我希望不是那麽复杂,希望有人能给我一个清晰而简明的答案.

如果我从文档中猜测,似乎--jars个、SparkContextaddJaraddFile方法将自动分发文件,而其他选项仅修改类路径.

为简单起见,我可以同时使用三个主要选项添加额外的应用程序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的好文章.然而,没有学到什么新东西.海报确实很好地说明了local driver(Yarn 客户)和remote driver(Yarn 簇)之间的区别.一定要记住这一点.

推荐答案

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)时使用的模式:

  1. 客户端模式-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
    
  2. 集群模式-在集群模式下,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/workusually,你会看到他们这样:

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文件中的选项

因此,请确保将这些值设置在适当的位置,这样当一个值优先于另一个值时,您就不会感到惊讶.

让我们分析问题中的每个选项:

  • --jarsSparkContext.addJar:这些是一样的.只有一个是通过电光提交设置的,一个是通过代码设置的.选一件更适合你的.需要注意的重要一点是,使用这两个选项does not add the JAR file to your driver/executor classpath中的任一个.您需要在两者上使用extraClassPath配置显式添加它们.
  • SparkContext.addJarvs 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

Java相关问答推荐

长音符

Selenium Java:无法访问IFRAME内部的元素

那么比较似乎不是词典学的,尽管doctor 这么说

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

JUnit—如何模拟局部变量对象方法调用

名称冲突具有相同的擦除

如何使用Jackson将XML元素与值和属性一起封装

Docker不支持弹性APM服务器

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

如何在Java springboot中从一个端点发送多个时间响应?

如何使用MapStrCut转换双向链接

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

Java 21内置http客户端固定运营商线程

谷歌应用引擎本地服务器赢得';t在eclipse上运行

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了