【问题标题】:Spark submit does automatically upload the jar to cluster?Spark submit 会自动将 jar 上传到集群吗?
【发布时间】:2016-03-27 07:24:51
【问题描述】:

我正在尝试将 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-submit 不会将文件上传到集群(yarn 或 k8s),因为它不受 spark 的控制(在 spark 驱动程序启动之前)。 --jars 仅将 jar 从驱动程序传输到执行程序(在驱动程序启动后)。

标签: apache-spark


【解决方案1】:

我看到您引用了spark-submit page from Spark Docs,但我会在Running Spark on YARN 页面上花费更多时间。底线,看:

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

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

所以我同意你的观点,你应该运行 --master yarn-cluster 而不是 --master yarn-client

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

引入 YARN 后,一些关于非 YARN 实现的基本假设发生了很大变化,主要与类路径和将 jar 推送给工作人员的需要有关。

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

YARN 集群模式。 Spark submit 确实会将您的 jar 文件上传到集群。 特别是,它将罐子放在 HDFS 中,这样您的驱动程序就可以读取 从那里。与其他部署一样,执行者从 司机。

所以最后,来自Apache Spark YARN doc

确保 HADOOP_CONF_DIR 或 YARN_CONF_DIR 指向目录 其中包含 Hadoop 的(客户端)配置文件 簇。这些配置用于写入 HDFS 并连接到 YARN 资源管理器。


注意:我只看到你添加了一个 JAR,如果需要添加其他 JAR,a special note about doing that with YARN

在 yarn-cluster 模式下,驱动程序运行在与 客户端,因此 SparkContext.addJar 无法与文件一起使用 对客户来说是本地的。使客户端上的文件可供 SparkContext.addJar,在启动时使用 --jars 选项包含它们 命令。

链接中的那个页面有一些例子。


And of course you downloaded or built the YARN-specific version of Spark.


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

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

来自Advanced Dependency Management,它似乎是两全其美,但也是手动将 jar 推送到所有节点的重要原因:

local: - 以 local:/ 开头的 URI 应作为本地存在 每个工作节点上的文件。 这意味着不会有网络 IO 发生,并且适用于推送到每个 worker,或通过 NFS、GlusterFS 等共享。

但我认为 local:/... 会更改为 hdfs:/ ... 不确定。

【讨论】:

    【解决方案2】:

    是和不是。这取决于你的意思。 Spark 将 .jar 部署到集群中的节点。但是,它不会将您的 .jar 文件从本地计算机上传到集群。

    您可以在Submitting Applications 页面中找到更多信息。如您所见,在您传递给 spark-submit 的参数中,有一个需要全局可见:application-jar

    application-jar:包含您的应用程序和 所有依赖项。该 URL 必须在您的内部全局可见 集群,例如 hdfs:// 路径或 file:// 路径 存在于所有节点上。

    据我了解,您想要的是使用 yarn-client,而不是 yarn-cluster。这将在客户端(例如,您尝试调用 spark-submit 的机器,例如您的笔记本电脑)中运行驱动程序,而无需在集群上复制 .jar 文件。有关此here 的更多信息。

    【讨论】:

    • 但我收到一个错误诊断:java.io.FileNotFoundException: 指向我的 jar,即使 jar 可用。
    • 该 URL 必须在集群内全局可见,例如,所有节点上都存在 hdfs:// 路径或 file:// 路径。
    • 如何调用 spark-submit 命令?您能否使用错误消息+调用 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
    • 你能用你得到的命令/错误更新你的问题吗?
    【解决方案3】:

    尝试在 /path/to/jar/file 之前添加 --jars 选项

    spark-submit --jars /tmp/test.jar

    【讨论】:

    • 还有一个 --driver-class-path 选项。如果您有多个 jar,您可以尝试使用冒号分隔的 jar 路径吗?
    • 如果您查看错误,我看到路径不完整“诊断:java.io.FileNotFoundException:文件文件:/Users/nish1013/proj1/target/x-service-1.0.0-201512141101- 确实不存在”,但在命令行中您指定了 /Users/nish1013/proj1/target/x-service-1.0.0-201512141101-assembly.jar
    猜你喜欢
    • 1970-01-01
    • 2018-10-29
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2015-05-05
    相关资源
    最近更新 更多