当前位置: 首页 > 知识库问答 >
问题:

将JAR文件添加到Spark作业-Spark提交

萧自珍
2023-03-14

真的...已经讨论了很多。

然而,有很多模棱两可之处,提供的一些答案。。。包括在JAR/执行器/驱动程序配置或选项中复制JAR引用。

应为每个选项澄清以下歧义、不清楚和/或省略的细节:

  • 类路径如何受到影响
    • 驾驶员
    • 执行器(用于正在运行的任务)
    • 两者都有
    • 一点也不
    • 对于任务(给每个执行者)
    1. --jar
    2. SparkContext.addJar(...)方法
    3. SparkContext.addFile(...)方法
    4. --confspark.driver.extraClassPath=...--drive-class-path...
    5. --confspark.driver.extraLibraryPath=...,或者--drive-Library-path...
    6. --confspark.executor.extraClassPath=...
    7. --confspark.executor.extraLibraryPath=...
    8. 别忘了,spack-提交的最后一个参数也是一个. jar文件。

    我知道在哪里可以找到主要的Apache Spark留档,特别是关于如何提交、可用选项以及JavaDoc。然而,这给我留下了相当多的漏洞,尽管它也得到了部分回答。

    我希望它不是那么复杂,希望有人能给我一个清晰简洁的答案。

    如果我从文档中猜到,似乎会自动分发文件,而其他选项只是修改类路径。

    为了简单起见,我可以同时使用这三个主要选项添加其他应用程序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
    

    我在另一篇帖子的回复上找到了一篇不错的文章。然而,没有学到什么新东西。海报确实很好地说明了本地驱动程序(纱线客户端)和远程驱动程序(纱线集群)之间的区别。一定要记住这一点。

共有3个答案

严俊友
2023-03-14

与JAR文件和类路径相关的其他可配置Spark选项,在yarn作为部署模式的情况下如下所示。

从火花留档,

包含要分发给YARN容器的Spark代码的库列表。默认情况下,YARN上的Spark将使用本地安装的Spark jar,但Spark jar也可以位于HDFS上的全球可读位置。这允许YARN将其缓存在节点上,这样就不需要在每次应用程序运行时分发它。例如,要指向HDFS上的jar,请将此配置设置为允许hdfs:///some/path.Globs。

包含所需Spark jar的归档文件,用于分发到纱线缓存。如果设置,此配置将替换spark。纱线jar和归档文件用于所有应用程序的容器中。归档文件应在其根目录中包含jar文件。与前面的选项一样,归档文件也可以托管在HDFS上,以加快文件分发速度。

用户可以配置此参数来指定他们的JAR文件,这些文件反过来会包含在Spark驱动程序的类路径中。

程胡非
2023-03-14

Apache Spark 2.1.0中的另一种方法是在Spark提交期间使用--confspark.driver.userClassPathFirst=true,这会通过使用--jars选项优先考虑用户添加到类路径的JAR文件来更改依赖项加载的优先级,从而更改Spark作业的行为。

戚学文
2023-03-14

ClassPath会根据您提供的内容而受到影响。有几种方法可以在类路径上设置某些内容:

  • <代码>火花。驾驶员extraClassPath或其别名--driver class path,可在运行驱动程序的节点上设置额外的类路径
  • <代码>火花。执行人。extraClassPath在工作节点上设置额外的类路径

如果您想让某个JAR同时作用于Master和Worker,那么必须在这两个标志中分别指定它们。

遵循与JVM相同的规则:

  • Linux:冒号,
  • e、 g:conf“spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar”

这取决于运行作业的模式

>

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选择了一个leader Worker节点来执行驱动程序进程。这意味着作业不是直接从主节点运行的。在这里,Spark不会设置HTTP服务器。您必须通过HDFS、S3或所有节点都可用的其他源手动使所有工作节点都可以使用JAR文件。

在“提交申请”中,Spark文档很好地解释了可接受的文件前缀:

使用spark submit时,应用程序jar以及--jars选项中包含的任何jar将自动传输到集群。Spark使用以下URL方案来允许不同的JAR传播策略:

  • file:-绝对路径和file:/URI由驱动程序的HTTP文件服务器提供服务,每个执行程序都从驱动程序HTTP服务器中提取文件。
  • hdfs:,超文本传输协议:, https:, ftp:-这些从URI中按预期下拉文件和JAR
  • local:-以local:/开头的URI预计将作为每个工作节点上的本地文件存在。这意味着不会产生网络IO,并且适用于推送到每个工作节点或通过NFS、GlusterFS等共享的大文件/JAR。

请注意,JAR和文件被复制到executor节点上每个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指定的任何选项。Spark文档中提到了这一点:

指定为标志或属性文件中的任何值都将传递给应用程序,并与通过SparkConf指定的值合并。直接在SparkConf上设置的属性具有最高优先级,然后将标志传递给Spark-提交或Spark-shell,然后是spark-defaults.conf文件中的选项

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

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

  • JAR与SparkContext的对比。addJar:这些是相同的。只有一个通过Spark submit设置,另一个通过代码设置。选择一个更适合你的。需要注意的一点是,使用这两个选项都不会将JAR文件添加到驱动程序/执行器类路径中。您需要在这两者上使用extraClassPath配置显式添加它们
  • SparkContext。添加JAR与SparkContext。addFile(添加文件):当您的代码需要使用依赖项时,请使用前者。当您只想将任意文件传递给工作节点时,请使用后者,这在代码中不是运行时依赖项
  • <代码>--配置spark。驾驶员extraClassPath=或--驱动程序类路径:这些是别名,选择哪个别名无关紧要
  • <代码>--配置spark。驾驶员extraLibraryPath=。。。,或--驱动程序库路径 同上,别名
  • <代码>--配置spark。执行人。extraClassPath= :当您的依赖项不能包含在一个über JAR中(例如,因为库版本之间存在编译时冲突)并且需要在运行时加载时,请使用此选项
  • <代码>--配置spark。执行人。extraLibraryPath= 这作为java传递。图书馆JVM的路径选项。当您需要JVM可见的库路径时,请使用此选项

假设为简单起见,我可以同时使用3个主要选项添加额外的应用程序jar文件是否安全:

您可以安全地假设这仅适用于客户端模式,而不适用于集群模式。正如我之前所说的。此外,您给出的示例有一些多余的参数。例如,将JAR文件传递到驱动程序库路径是无用的。如果希望它们位于类路径上,则需要将它们传递到类外路径。最终,当您在驱动程序和工作程序上部署外部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
 类似资料:
  • 是的...已经讨论了很多了。 但是,有很多不明确的地方,提供了一些答案...包括在jars/executor/driver配置或选项中重复jar引用。 类路径的影响 驱动程序 执行程序(用于正在运行的任务) 两者 一点也不 对于任务(对每个执行者) 用于远程驱动程序(如果在群集模式下运行) 方法 方法 或 或 不要忘记,spark-submit的最后一个参数也是一个.jar文件。 如果我从文档中猜

  • 问题内容: 但是有很多歧义和提供的一些答案…包括在jars / executor / driver配置或选项中复制jar引用。 How ClassPath is affected Driver Executor (for tasks running) Both not at all Separation character: comma, colon, semicolon If provided

  • 我在纱线簇上使用Spark2.1(BTW)。 我正在尝试在纱线集群上传罐子,并使用它们来替代现场(alreading in-place)火花罐子。 我正试图通过Spark-Submit这样做。 “--jars”用于在每个节点上上传jar “--driver-class-path”用于将上载的jar用于驱动程序。 “--conf spark.executor.extraclasspath”用于将上载

  • 我正在尝试使用spark-submit选项添加redshift jar: 在Spark 2.1.0上运行命令 spark-submit--类测试--主spark:/xyz.local:7077--executor-cores 4--总-executor-cores 32--executor-memory 6G--驱动程序-memory 4G--驱动程序-cores 2--部署模式集群-jars S

  • 我是spark和scala的新手,我很难提交一份作为YARN客户的spark工作。通过spark shell(spark submit)执行此操作没有问题:首先在eclipse中创建一个spark作业,然后将其编译到jar中,并通过内核shell使用spark submit,如下所示: 然而,使用Eclipse直接编译并将其提交给YARN似乎很困难。 我的项目设置如下:我的集群运行CDH clou

  • 问题内容: 我正在做一个Maven项目。当在一个想法中编译和运行我的项目时,一切都很好,但是每当我创建jar文件时,都无法将web / lib /中的外部jar文件复制到jar文件中。为什么会发生这种情况?我可以将所有文件插入jar文件吗? 问题答案: 是的,我找到了解决方案。