当前位置: 首页 > 知识库问答 >
问题:

Spark submit是否会自动将jar上传到集群?

胥英奕
2023-03-14

我正在尝试从本地机器终端向我的集群提交一个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

共有1个答案

司英彦
2023-03-14

我看到你在引用Spark Docs的spark-submit页面,但我会花更多的时间在运行Spark on YARN页面上。底线,看看:

有两种部署模式可用于在Yarn上启动Spark应用程序。在yarn-cluster模式下,Spark驱动程序在集群上由YARN管理的应用程序主进程内运行,客户端可以在启动应用程序后离开。在yarn-client模式下,驱动程序运行在客户端进程中,应用程序主程序仅用于向Yarn请求资源。

您还注意到,“我也需要在我的集群上运行驱动程序,而不是在我提交应用程序的机器上,即我的本地机器上。”

因此,我同意您的观点,即运行--master yarn-cluster而不是--master yarn-client是正确的

(有一条注释指出,您删除了“assembly.jar”,这可能只是一个语法错误,但我认为这也适用...)

引入YARN时,关于非YARN实现的一些基本假设发生了很大变化,主要与类路径和向工作者推jars的需要有关。

来自Apache Spark用户列表上的电子邮件:

纱线簇模式。Spark submit会将您的JAR上传到集群。特别是,它将JAR放在HDFS中,这样驱动程序就可以从那里读取。与其他部署一样,执行程序从驱动程序中提取JAR。

所以最后,从Apache Spark YARN文档:

确保HADOOP_CONF_DIR或YARN_CONF_DIR指向包含Hadoop集群的(客户端)配置文件的目录。这些配置用于写入HDFS并连接到YARN ResourceManager。

注意:我只看到您添加了一个罐子,如果需要添加其他罐子,有一个关于用Yarn做这件事的特别注意:

背景技术,在使用spark-submit和option-deploy-mode集群的独立集群部署中,是的,您确实需要确保每个工作节点都可以访问所有的依赖项,Spark不会将它们推到集群。这是因为在以Spark作为作业管理器的“独立集群”模式下,您不知道驱动程序将运行在哪个节点上!但这不适用于你的案子。

但是如果可以的话,根据您上传的JAR的大小,我仍然会将JAR显式地放在每个节点上,或者通过HDFS“全局可用”,这是文档中的另一个原因:

从高级依赖项管理来看,它似乎提供了两全其美的效果,但也是手动将JAR推出到所有节点的一个很好的原因:

local:-以local:/开头的URI应该作为本地文件存在于每个工作节点上。这意味着不会产生网络IO,并且对于推送给每个工作者或通过NFS、GlusterFS等共享的大型文件/JAR很好地工作。

但我假设本地:/...会更改为HDFS:/...不确定。

 类似资料:
  • 我有一个多项目的gradle构建。其中一个名为project2的子项目使用war插件。我希望这个子项目同时生成一个war和一个jar,但我只将jar文件上传到maven artifactory。我在父构建中执行了以下操作。gradle文件: 这将正确地生成一个project1 jar和一个project2 war,并上传project1 jar。然而,这也上传了Project2War,这是我不想要

  • 我尝试遵循:在github上托管Maven存储库 我的POM.xml 我得到了以下错误: ===========================================================================================================================================================

  • 问题内容: 我知道Java中的安全模式是在finally块中依次关闭ResultSet,Statement和Connection。 如果您关闭连接,然后尝试关闭语句(不抛出异常)。但是,如果您尝试从语句中调用任何方法,则会引发异常。 我想知道关闭连接是否会自动关闭从该连接创建的所有语句对象? 更新: 我正在使用DatabaseProductVersion:Oracle Database 11g版本

  • 我有这个代码,我确实想要一个特定模式的替换,但不是多就地替换。 结果是 但愿如此 同样,通过“循环”,我们得到了相同的结果。 它很小,非常令人失望!! 有什么建议说明为什么会这样吗?

  • 问题内容: 我想运行以下查询: 以下查询(来自主查询的子查询): 在7秒内执行,从210万行的表中产生了2691行。 我在上面触发了 主查询 ,并且在等待5分钟以上之后它仍在执行。 最后,我分别执行了子查询,从结果中提取了2691条记录,执行了以下查询: 令人惊讶的是,这在40秒内给了我一个答案。 是什么赋予了?为什么MySQL不使用我使用的相同技术并迅速给出答案?难道我做错了什么? 问题答案:

  • 我通过独立集群配置构建了Spark集群。 我设置PYSPARK_PYTHON如下。 PYSPARK_PYTHON=/usr/bin/python2。7. 我使用spark submit将此代码提交给spark master。 我以为这段代码不会工作,因为我没有安装sci-py在工人。但它起作用了。这样做对吗?我通过Web-UI确认了此代码也在集群上运行。