我正在尝试从本地计算机终端向我的群集提交Spark应用程序.我正在使用--master yarn-cluster
.我也需要在我的集群上运行驱动程序,而不是在我提交应用程序的机器上运行,即我的本地机器
当我提供本地机器中应用程序jar的路径时,spark-submit会自动将其上传到我的群集吗?
我正在使用
bin/spark-submit --class com.my.application.XApp --master yarn-cluster --executor-memory 100m --num-executors 50 /Users/nish1013/proj1/target/x-service-1.0.0-201512141101-assembly.jar 1000
并得到错误
Diagnostics: java.io.FileNotFoundException: File file:/Users/nish1013/proj1/target/x-service-1.0.0-201512141101- does not exist
在文档中,http://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit
高级依赖关系管理 使用spark-submit时,应用程序jar以及--jars选项中包含的任何jar都将自动传输到群集.
但似乎没有!
我看到你引用了Spark Docs的spark-submit页面,但我会在YARN页面上的Running Spark上花费更多的时间.底线,看看:
有两种部署模式可用于在YARN上启动Spark应用程序.在yarn-cluster模式下,Spark驱动程序在应用程序主进程内运行,该进程由群集上的YARN管理,客户端可以在启动应用程序后消失.在yarn-client模式下,驱动程序在客户端进程中运行,而应用程序主服务器仅用于从YARN请求资源.
此外,您还注意到,"我也需要在我的群集上运行驱动程序,而不是在我提交应用程序的机器上运行,即我的本地机器"
所以我同意你的意见,你是正确的,--master yarn-cluster
而不是--master yarn-client
(并且有一条评论指出在你删除"assembly.jar"时可能只是语法错误,但我认为这也适用于...)
当引入YARN时,关于非YARN实现的一些基本假设会发生很大变化,主要与类路径相关,并且需要将jar推送给工作者.
从Apache Spark用户列表中的电子邮件:
YARN群集模式.Spark submit会将您的jar上传到群集.特别是,它将罐装在HDFS中,因此您的驱动程序可以从那里读取.与其他部署一样,执行程序从驱动程序中提取jar.
最后,来自Apache Spark YARN doc:
确保HADOOP_CONF_DIR或YARN_CONF_DIR指向包含Hadoop集群的(客户端)配置文件的目录.这些配置用于写入HDFS并连接到YARN ResourceManager.
注意:我只看到你添加一个JAR,如果需要添加其他JAR,那么有一个关于使用YARN执行此操作的特殊注释:
在纱线群集模式下,驱动程序在与客户端不同的机器上运行,因此SparkContext.addJar将无法使用客户端本地文件开箱即用.要使客户端上的文件可用于SparkContext.addJar,请在启动命令中使用--jars选项包含它们.
链接中的该页面有一些示例.
当然,您下载或构建了特定于YARN的Spark版本.
背景,在使用spark-submit和选项--deploy-mode集群的独立集群部署中,是的,您需要确保每个工作节点都可以访问所有依赖项,Spark不会将它们推送到集群.这是因为在Spark作为作业管理器的"独立集群"模式下,您不知道驱动程序将在哪个节点上运行!但这并不适用于您的情况.
但是,如果可以的话,根据您上传的罐子的大小,我仍然会明确地将罐子放在每个节点上,或者通过HDFS"全局可用",这是来自文档的另一个原因:
从高级依赖管理,它似乎呈现两全其美,但也是手动将您的罐子推送到所有节点的一个很好的理由:
local: - 以local:/开头的URI应该作为每个工作节点上的本地文件存在.这意味着不会产生任何网络IO,并且适用于推送给每个工作者或通过NFS,GlusterFS等共享的大型文件/ JAR.
但我假设本地:/ ...将改为hdfs:/ ...不确定那个.
是的,不是.这取决于你的意思.Spark将.jar部署到集群中的节点.但是,它不会将.jar文件从本地计算机上载到群集.
您可以在" 提交应用程序"页面中找到更多信息.正如您所看到的,在传递给spark-submit的参数中,有一个需要全局可见:application-jar.
application-jar:包含应用程序和所有依赖项的捆绑jar的路径.URL必须在群集内部全局可见,例如,hdfs://路径或所有节点上都存在的file://路径.
据我所知,你想要的是使用纱线客户,而不是纱线集群.这将在客户端中运行驱动程序(例如,您尝试调用spark-submit的计算机,例如您的笔记本电脑),而无需在群集上复制.jar文件.更多关于这里.