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


Mystery☀
2025-02-05 04:37:24 (15天前)


spark.executor.extraClassPath = …
–conf spark.executor.extraLibraryPath = …
不要忘记,最后一个参数

火花
</跨度>
-submit也是一个.jar文件。

我知道在哪里可以找到主要的

火花
</跨度>
文档,…时间:


火花
</跨度>
-submit –jar additional1.jar,additional2.jar \
–driver-library-path additional1.jar:additional2.jar \
–conf spark.executor.extraLibraryPath = additional1.jar:additional2.jar …

4 条回复
  1. 0# 我头上有犄角 | 2019-08-31 10-32



    使用受到限制

    —jars

    :如果要为位置指定目录

    jar/xml

    文件,它不允许目录扩展。这意味着如果您需要为每个jar指定绝对路径。



    如果你指定

    —driver-class-path

    并且您正在纱线群集模式下执行,然后驱动程序类不会更新。我们可以在选项卡环境下验证spark ui或spark history server下的类路径是否更新。



    对我来说通过包含目录扩展并在纱线集群模式下工作的罐子的选项是

    —conf

    选项。传递驱动程序和执行程序类路径更好

    —conf

    ,它将它们添加到spark会话对象本身,这些路径反映在Spark配置上。但请确保将jar放在整个群集的相同路径上。




    1. spark-submit \
      master yarn \
      queue spark_queue \
      deploy-mode cluster \
      num-executors 12 \
      executor-memory 4g \
      driver-memory 8g \
      executor-cores 4 \
      conf spark.ui.enabled=False \
      conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
      conf spark.hadoop.mapred.output.dir=/tmp \
      conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
      conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

    2. </code>

  2. 1# 筱梨 | 2019-08-31 10-32



    类路径。



    ClassPath会受到影响,具体取决于您提供的内容。有几种方法可以在类路径上设置一些东西:





    • spark.driver.extraClassPath

      或者它的别名

      —driver-class-path

      在运行驱动程序的节点上设置额外的类路径。



    • spark.executor.extraClassPath

      在Worker节点上设置额外的类路径。



    如果您希望某个JAR在Master和Worker上都有效,则必须在BOTH标志中单独指定它们。



    分离特征:




    遵循与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”






    文件分发:



    这取决于您正在运行的工作模式:





    1. 客户端模式 - Spark启动Netty HTTP服务器,该服务器在启动时为每个工作节点分配文件。您可以看到启动Spark作业时:




      1. 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.     </code>
      3.   </pre>
      4. </LI>
      5. <LI>
      6.   <P>
      7.     群集模式 - 在群集模式中,spark选择了一个领导者工作节点来执行驱动程序进程。这意味着作业不是直接从主节点运行。在这里,Spark
      8.     的<strong>
      9.       将不会
      10.     </强>
      11.      设置HTTP服务器。您必须通过HDFS / S3 /所有节点可用的其他源手动使JARS可用于所有工作节点。
      12.   </p>
      13. </LI>
      14. </醇>


        文件的接受URI





        “提交申请”

        Spark文档很好地解释了文件的接受前缀:




        当使用spark-submit时,应用程序jar和任何jar
        包含在—jars选项中将自动转移到
        集群。 Spark使用以下URL方案来允许不同的
        传播罐子的策略:




        • file - 绝对路径和文件:/ URI由驱动程序的HTTP提供
          文件服务器,每个执行程序从驱动程序HTTP中提取文件
          服务器。


        • hdfs:,http:,https:,ftp - 这些下拉文件和JAR
          来自URI的预期


        • local - local:/开头的URI
          期望在每个工作节点上作为本地文件存在。这意味着
          不会产生网络IO,适用于大型文件/ JAR
          被推送到每个工作者,或通过NFSGlusterFS等共享。



        请注意,JAR和文件将复制到每个工作目录中
        执行程序节点上的SparkContext




        如上所述,JAR被复制到

        工作目录

        对于每个Worker节点。究竟是哪里?它是

        平时



        /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

      15. </code>


      16. 当你向内看时,你会看到你所部署的所有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-rr 1 spark spark 457 May 8 17:34 stderr
        -rw-rr 1 spark spark 0 May 8 17:34 stdout

      17. </code>


      18. 受影响的选项:



        最重要的是要理解

        优先
        </强>
        。如果您通过代码传递任何属性,它将优先于您指定的任何选项

        spark-submit

        。这在Spark文档中提到:




        将传递指定为标志或属性文件中的任何值
        在应用程序上并与通过指定的那些合并
        SparkConf

        直接在SparkConf上设置的属性最高
        优先权
        </强>
        ,然后标志传递给spark-submitspark-shell
        spark-defaults.conf文件中的选项




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



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





        • jars

          VS

          SparkContext.addJar

          :这些是相同的,只有一个是通过spark提交和一个通过代码设置的。选择最适合你的那个。需要注意的一件重要事情是使用这些选项中的任何一个的
          不会将JAR添加到您的驱动程序/执行程序类路径中
          </强>
          ,你需要使用显式添加它们

          extraClassPath

          配置两者。



        • SparkContext.addJar

          VS

          SparkContext.addFile

          :当你有一个时使用前者

          依赖
          </强>
          需要与您的代码一起使用。当您只想将任意文件传递给工作节点时使用后者,这不是代码中的运行时依赖性。



        • conf spark.driver.extraClassPath=…

          要么

          driver-class-path

          :这些是别名,无论你选择哪一个都没关系



        • conf spark.driver.extraLibraryPath=…, or driver-library-path

          与上面相同,别名。



        • conf spark.executor.extraClassPath=…

          :如果您具有无法包含在uber JAR中的依赖项(例如,因为库版本之间存在编译时冲突)以及您需要在运行时加载的依赖项,请使用此选项。



        • conf spark.executor.extraLibraryPath=…

          这是作为传递

          java.library.path

          JVM的选项。当您需要JVM可见的库路径时,请使用此选项。




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




        您可以安全地假设这只适用于客户端模式,而不是群集模式。正如我之前所说的那样。此外,您给出的示例有一些冗余的参数。例如,将JAR传递给

        driver-library-path

        没用,你需要把它们传递给

        extraClassPath

        如果你想让它们在你的类路径上。最终,当您在驱动程序和worker上部署外部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

      19. </code>

  3. 2# 听风~ | 2019-08-31 10-32



    另一种方法

    spark 2.1.0

    就是用

    —conf spark.driver.userClassPathFirst=true

    在spark-submit期间,它改变了依赖性加载的优先级,从而改变了spark-job的行为,通过优先使用用户添加到类路径的jar来实现

    —jars

    选项。


登录 后才能参与评论