在Book Spark in Action中,我正在读这个:
“如果您使用spark-submit脚本以集群部署模式提交应用程序,则您指定的JAR文件需要在将要执行应用程序的worker(在您指定的位置)上可用。因为没有办法事先说明哪个worker会执行你的驱动程序,所以如果你打算使用集群部署模式,你应该将应用程序的JAR文件放在所有worker上,或者你可以将应用程序的JAR文件放在HDFS上并使用HDFS URL作为JAR文件名。“
但是在官方文档中我看到了:
1 - 如果您的代码依赖于其他项目,则需要将它们与应用程序一起打包,以便将代码分发到Spark群集。为此,请创建包含代码及其依赖项的程序集jar(或“uber”jar)。 sbt和Maven都有汇编插件。在创建程序集jar时,将Spark和Hadoop列为提供的依赖项;这些不需要捆绑,因为它们是由集群管理器在运行时提供的。一旦你有了一个装配好的jar,你可以在传递jar时调用bin / spark-submit脚本,如图所示。
2 - 如果您的应用程序是通过Spark提交启动的,那么 应用程序jar自动分发到所有工作节点。对于 您应该依赖的任何其他罐子 使用逗号作为分隔符,通过--jars标志指定它们(例如 --jars jar1,jar2)。要控制应用程序的配置或执行环境,请参阅Spark配置。
我在这里缺少什么?它是如何工作的 ?我是否需要在整个集群中部署我的程序集jar(期望主节点)?
答案 0 :(得分:1)
当您在群集部署模式下运行作业时,通过 - jars 指定的从属JARS将从本地路径复制到HDFS上的容器。
以下是控制台输出,您可以在其中看到应用程序JAR( mapRedQA-1.0.0.jar )以及所需的配置( __ spark_conf__5743283277173703345.zip )已上传到HDFS上的容器,所有执行程序节点都可以访问它。这就是为什么你不需要将应用程序JAR放在工作节点上的原因Spark会处理它。
17/08/10 11:42:55 INFO yarn.Client: Preparing resources for our AM container
17/08/10 11:42:57 INFO yarn.YarnSparkHadoopUtil: getting token for namenode: hdfs://master.localdomain:8020/user/user1/.sparkStaging/application_1502271179925_0001
17/08/10 11:43:19 INFO hdfs.DFSClient: Created token for user1: HDFS_DELEGATION_TOKEN owner=user1@EXAMPLE.COM, renewer=yarn, realUser=, issueDate=1502379778376, maxDate=1502984578376, sequenceNumber=6144, masterKeyId=243 on 2.10.1.70:8020
17/08/10 11:43:25 INFO yarn.Client: Uploading resource file:/Automation/mapRedQA-1.0.0.jar -> hdfs://master.localdomain:8020/user/user1/.sparkStaging/application_1502271179925_0001/mapRedQA-1.0.0.jar
17/08/10 11:43:51 INFO yarn.Client: Uploading resource file:/tmp/spark-f4e913eb-17d5-4d5b-bf99-c8212715ceaa/__spark_conf__5743283277173703345.zip -> hdfs://master.localdomain:8020/user/user1/.sparkStaging/application_1502271179925_0001/__spark_conf__5743283277173703345.zip
17/08/10 11:43:52 INFO spark.SecurityManager: Changing view acls to: user1
17/08/10 11:43:52 INFO spark.SecurityManager: Changing modify acls to: user1
17/08/10 11:43:52 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(user1); users with modify permissions: Set(user1)
17/08/10 11:43:53 INFO yarn.Client: Submitting application 1 to ResourceManager
17/08/10 11:43:58 INFO impl.YarnClientImpl: Application submission is not finished, submitted application application_1502271179925_0001 is still in NEW
t: Application report for application_1502271179925_0001 (state: ACCEPTED)
答案 1 :(得分:0)
如果为群集定义了HDFS,则无需在整个节点上复制应用程序jar。如果在这种情况下没有hdfs支持的集群,则需要使用相同的路径隐式地复制整个工作者/从属服务器上的所有应用程序jar。
答案 2 :(得分:0)
从maasg接受的答案(以及Ajit的答案)都假定您正在提交给 YARN 母版。如果真是这样,那么的确,您的应用程序jar将自动(通过HDFS?)提供给集群。
但是,如果您要提交给独立主服务器,并且您的部署模式是集群,那么Spark不会执行什么来分发您的应用程序罐子。
官方文档中缺乏这种区别,这令人非常沮丧。我见过的唯一提到的地方是git commit comment for fixing SPARK-2260:
可能或可能不是问题的一件事是jar必须在驱动程序节点上可用。在
standalone-cluster
模式下,这实际上意味着这些jar必须在所有辅助计算机上都可用,因为驱动程序是在其中一个上启动的。这里的语义与yarn-cluster mode
的语义不同,在UnicodeString
中,所有相关的jar会自动上载到分布式缓存中并运送到容器中。这可能不是问题,但仍然值得一提。
TLDR :对于独立的主服务器,请收听“ Spark in Action”。对于YARN,您将不会遇到此问题。