向spark作业添加jar-spark提交

inkz8wg9  于 2021-07-03  发布在  Java
关注(0)|答案(6)|浏览(381)

是的。。。已经讨论了很多了。
然而,有很多模棱两可和一些答案提供。。。包括在jars/executor/driver配置或选项中复制jar引用。

含糊不清和/或遗漏的细节

应为每个选项澄清以下含糊不清、不明确和/或遗漏的细节:
类路径如何受到影响
司机
执行器(用于正在运行的任务)
二者都
一点也不
分隔符:逗号、冒号、分号
如果提供的文件是自动分发的
对于任务(对每个执行者)
对于远程驱动程序(如果在群集模式下运行)
接受的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=... 不要忘记,spark submit的最后一个参数也是一个.jar文件。
我知道在哪里可以找到主要的spark文档,特别是关于如何提交、可用选项以及javadoc。然而,这仍然给我留下了不少漏洞,尽管它也有部分答案。
我希望它不是那么复杂,希望有人能给我一个明确而简洁的答案。
如果我从文件中猜出来 --jars ,和
SparkContext addJar 以及 addFile 方法是自动分发文件的方法,而其他选项只是修改类路径。
为了简单起见,我可以同时使用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客户端)和远程驱动程序(Yarn集群)之间的区别。一定要记住。

dldeef67

dldeef671#

另一种方法 spark 2.1.0 是用来 --conf spark.driver.userClassPathFirst=true 在spark submit过程中,通过对jar赋予优先级,改变依赖项加载的优先级,从而改变spark作业的行为 --jars 选项。

jtoj6r0c

jtoj6r0c2#

当使用spark submit with--master warn cluster时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到集群。在--jar之后提供的URL必须用逗号分隔。该列表包含在驱动程序和执行器类路径中
例子:
spark submit--主Yarn簇--jars../lib/misc.jar,../lib/test.jar--类mainclass mainapp.jar
https://spark.apache.org/docs/latest/submitting-applications.html

ercv8c1e

ercv8c1e3#

与jar和类路径相关的其他可配置spark选项 yarn 部署模式如下
从spark文档中,

Spark纱罐

包含要分发到容器的spark代码的库的列表。默认情况下,spark-on-yarn将使用本地安装的spark-jar,但是spark-jar也可以位于hdfs上的世界可读位置。这允许yarn在节点上缓存它,这样就不需要在每次应用程序运行时都分发它。例如,要指向hdfs上的jar,请将此配置设置为hdfs:///some/path。允许使用glob。

spark.yarn.archive文件

一个包含需要的spark jar的归档文件,用于分发到yarn缓存。如果已设置,则此配置将替换spark.yarn.jars,并且存档将用于所有应用程序的容器中。归档文件的根目录中应该包含jar文件。与前面的选项一样,归档文件也可以托管在hdfs上,以加快文件分发。
用户可以配置这个参数来指定他们的jar,inturn包含在spark驱动程序的类路径中。

oiopk7p5

oiopk7p54#

当我们使用spark submit实用程序提交spark作业时,有一个选项 --jars . 使用这个选项,我们可以将jar文件传递给spark应用程序。

k2arahey

k2arahey5#

类路径:

类路径会受到影响,具体取决于您提供的内容。有两种方法可以设置类路径上的内容: spark.driver.extraClassPath 或者是化名 --driver-class-path 在运行驱动程序的节点上设置额外的类路径。 spark.executor.extraClassPath 在工作节点上设置额外的类路径。
如果希望某个jar同时对主进程和工作进程生效,则必须在两个标志中分别指定它们。

分隔字符:

遵循与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" ####文件分发:
这取决于运行作业的模式:
客户机模式—spark启动netty 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对所有工作节点可用。

文件的已接受uri

在“提交申请”中,spark文档很好地解释了可接受的文件前缀:
使用spark submit时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到集群。spark使用以下url方案来允许使用不同的策略来传播JAR:
file:-绝对路径和file:/uri由驱动程序的http文件服务器提供服务,每个执行器从驱动程序http服务器提取文件。
hdfs:、http:、https:、ftp:-这些文件和jar按预期从uri中下拉
local:-以local:/开头的uri应作为本地文件存在于每个工作节点上。这意味着不会产生网络io,对于推送到每个worker或通过nfs、glusterfs等共享的大型文件/jar来说效果很好。
注意,jar和文件被复制到executor节点上每个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

当你往里面看的时候,你会看到所有你部署的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 submit或spark shell,然后是spark-defaults.conf文件中的选项
因此,请确保将这些值设置在适当的位置,这样当一个值优先于另一个值时,您就不会感到惊讶。
让我们分析每个有问题的选项: --jarsSparkContext.addJar :这些是相同的,只有一个通过spark submit设置,一个通过代码设置。选一个更适合你的。需要注意的一点是,使用这两个选项中的任何一个都不会将jar添加到驱动程序/执行器类路径中,您需要使用 extraClassPath 两个都配置。 SparkContext.addJarSparkContext.addFile :当需要与代码一起使用依赖项时,请使用前者。当您只想将任意文件传递给工作节点时,请使用后者,这在代码中不是运行时依赖项。 --conf spark.driver.extraClassPath=... 或者 --driver-class-path :这些是别名,不管您选择哪一个 --conf spark.driver.extraLibraryPath=..., or --driver-library-path ... 同上,别名。 --conf spark.executor.extraClassPath=... :当您有一个不能包含在uberjar中的依赖项(例如,因为库版本之间存在编译时冲突)并且需要在运行时加载时使用此选项。 --conf spark.executor.extraLibraryPath=... 这是作为 java.library.path jvm的选项。当您需要对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
icnyk63a

icnyk63a6#

使用有限制 --jars :如果要指定目录作为 jar/xml 文件,它不允许目录扩展。这意味着如果需要为每个jar指定绝对路径。
如果您指定 --driver-class-path 并且您在yarn cluster模式下执行,那么驱动程序类不会得到更新。我们可以在spark ui或tab环境下的spark history server下验证类路径是否更新。
对于我来说,传递包含目录扩展的jar和在yarn集群模式下工作的选项是 --conf 选项。最好将驱动程序和执行器类路径作为 --conf ,它将它们添加到spark会话对象本身,这些路径将反映在spark配置上。但请确保将jar放在集群的同一条路径上。

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

相关问题