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

将JAR添加到Spark作业-spark-submit

赵渊
2023-03-14

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

但是,有很多不明确的地方,提供了一些答案...包括在jars/executor/driver配置或选项中重复jar引用。

  • 类路径的影响
    • 驱动程序
    • 执行程序(用于正在运行的任务)
    • 两者
    • 一点也不
    • 对于任务(对每个执行者)
    • 用于远程驱动程序(如果在群集模式下运行)
    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文件。

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

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

    在另一个帖子的答案上找到了一篇很好的文章。然而,并没有什么新的发现。这张海报确实很好地说明了本地驱动程序(yarn-client)和远程驱动程序(yarn-cluster)之间的区别。一定要记住。

共有1个答案

胥良平
2023-03-14

类路径受影响取决于您提供的内容。有两种方法可以在类路径上设置某些内容:

  • spark.driver.extraclasspath或其别名--driver-class-path在运行驱动程序的节点上设置额外的类路径。
  • spark.executor.extraclasspath在工作节点上设置额外的类路径。

如果您希望某个JAR同时作用于主程序和辅助程序,您必须在两个标志中分别指定这些。

  • Linux:冒号:
    • 例如:--conf“spark.driver.extraclasspath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar”
    • 例如:--conf“spark.driver.extraclasspath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar”

    这取决于运行作业的模式:

    >

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

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

    • 文件:-绝对路径和文件:/URIs由驱动程序的HTTP文件服务器提供服务,每个执行程序从驱动程序HTTP服务器中提取文件。
    • hdfs:、http:、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
    

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

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

    让我们分析一下所讨论的每个选项:

      null

    您可以放心地假设这仅适用于客户端模式,而不是集群模式。就像我之前说过的。还有,你给出的例子有一些多余的参数。例如,将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引用。 应为每个选项澄清以下歧义、不清楚和/或省略的细节: 类路径如何受到影响 驾驶员 执行器(用于正在运行的任务) 两者都有 一点也不 对于任务(给每个执行者) 方法 方法 或 ,或者 别忘了,spack-提交的最后一个参数也是一个. jar文件。 我知道在哪里可以找到主

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

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

  • 我正在尝试使用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

  • 那么需要在命令中做哪些更改来加载包呢? 此包的详细信息显示在https://mvnrepository.com/artifact/cloudant-labs/spark-cloudant/2.0.0-S2.11中