但是有很多歧义和提供的一些答案…包括在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文件。
我知道在哪里可以找到主要的spark文档,尤其是有关如何提交,可用的选项以及JavaDoc的信息。但是,这仍然给我留下了很多空白,尽管它也可以部分解决。
我希望这不是那么复杂,并且有人可以给我一个清晰简洁的答案。
如果我从文档中猜测,似乎–jars和SparkContext addJar和addFile方法是将自动分发文件的方法,而其他选项仅修改了ClassPath。
为简单起见,可以安全地假设我可以同时使用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)之间的区别。要牢记绝对重要。
类路径:
ClassPath的影响取决于你提供的内容。有两种方法可以在类路径上进行设置:
spark.driver.extraClassPath
或--driver-class-path
在运行驱动程序的节点上设置额外的类路径的别名。spark.executor.extraClassPath
在Worker节点上设置额外的类路径。分隔符:
遵循与JVM相同的规则:
--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启动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节点以执行Driver进程。这意味着作业不是直接从“主”节点运行。在这里,Spark 不会设置HTTP服务器。你必须通过可用于所有节点的HDFS / S3 / Other来源手动将JARS提供给所有工作节点。
文件接受的URI
在“提交应用程序”中,Spark文档很好地解释了文件的可接受前缀:
使用spark-submit时,应用程序jar以及–jars选项随附的所有jar都会自动传输到集群。Spark使用以下URL方案来允许不同的策略来传播jar:
如前所述,将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文件中的选项
因此,请确保将这些值设置在适当的位置,以便当一个优先级高于另一个时,你不会感到惊讶。
让我们分析每个有问题的选项:
--jarsvs SparkContext.addJar
:这些是相同的,只有一个是通过spark提交设置的,一个是通过代码设置的。选择一个更适合你的套件。需要注意的重要一点是,使用这两个选项中的任何一个都不会将JAR添加到驱动程序/执行器类路径中,你需要使用这两个选项上的extraClassPathconfig
显式添加它们。SparkContext.addJarvs SparkContext.addFile
:当你的代码需要使用依赖项时,请使用前者。仅在要将任意文件传递到工作程序节点时使用后者,这不是代码中的运行时依赖项。--conf spark.driver.extraClassPath=...
或--driver-class-path
:这些是别名,与选择哪一个无关紧要--conf spark.driver.extraLibraryPath=...
, or --driver-library-path ...
与上面相同,别名。--conf spark.executor.extraClassPath=...
:当你具有无法包含在超级JAR中的依赖项时(例如,由于库版本之间存在编译时冲突)并且需要在运行时加载时,请使用此函数。--conf spark.executor.extraLibraryPath=...
这作为java.library.pathJVM
的选项传递。需要JVM可见的库路径时,请使用此选项。你可以放心地假设仅针对客户端模式,而不适用于集群模式。正如我之前所说。另外,你给出的示例还有一些多余的参数。例如,将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文件。 我知道在哪里可以找到主
是的...已经讨论了很多了。 但是,有很多不明确的地方,提供了一些答案...包括在jars/executor/driver配置或选项中重复jar引用。 类路径的影响 驱动程序 执行程序(用于正在运行的任务) 两者 一点也不 对于任务(对每个执行者) 用于远程驱动程序(如果在群集模式下运行) 方法 方法 或 或 不要忘记,spark-submit的最后一个参数也是一个.jar文件。 如果我从文档中猜
我在纱线簇上使用Spark2.1(BTW)。 我正在尝试在纱线集群上传罐子,并使用它们来替代现场(alreading in-place)火花罐子。 我正试图通过Spark-Submit这样做。 “--jars”用于在每个节点上上传jar “--driver-class-path”用于将上载的jar用于驱动程序。 “--conf spark.executor.extraclasspath”用于将上载
我正在为Spark Streaming作业构建指标系统,在系统中,指标收集在每个执行程序中,因此需要在每个执行程序中初始化指标源(用于收集指标的类)。 度量源被打包在一个jar中,当提交作业时,jar使用参数'--jars'从本地发送到每个执行器,但是,执行器在jar到达之前开始初始化度量源类,因此,它会抛出类未找到异常。 似乎如果执行者可以等到所有资源都准备好,问题就会得到解决,但我真的不知道该
我是spark和scala的新手,我很难提交一份作为YARN客户的spark工作。通过spark shell(spark submit)执行此操作没有问题:首先在eclipse中创建一个spark作业,然后将其编译到jar中,并通过内核shell使用spark submit,如下所示: 然而,使用Eclipse直接编译并将其提交给YARN似乎很困难。 我的项目设置如下:我的集群运行CDH clou
18:02:55,271错误UTILS:91-中止任务java.lang.nullpointerException在org.apache.spark.sql.catalyst.expressions.generatedClass$GeneratedIterator.agg_doAggregateWithKeys$(未知源)在org.apache.spark.sql.catalyst.express