spark-submit / spark-shell > yarn-client 和 yarn-cluster 模式的区别

Posted

技术标签:

【中文标题】spark-submit / spark-shell > yarn-client 和 yarn-cluster 模式的区别【英文标题】:Spark-submit / spark-shell > difference between yarn-client and yarn-cluster mode 【发布时间】:2016-01-18 23:39:23 【问题描述】:

我正在使用 YARN 运行 Spark。

来自链接:http://spark.apache.org/docs/latest/running-on-yarn.html

我找到了不同纱线模式的解释,即 --master 选项,Spark 可以使用该选项运行:

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

在此,我只能理解驱动程序在哪里运行,但我无法理解哪个运行得更快。更何况:

在运行 Spark-submit 的情况下,--master 可以是 clientcluster 对应Spark-shell的master选项可以是yarn-client但是不支持cluster模式

所以不知道怎么选择,即什么时候用spark-shell,什么时候用spark-submit,特别是什么时候用client模式,什么时候用cluster 模式

【问题讨论】:

看看这个related answer 【参考方案1】:

spark-shell 应该用于交互式查询,它需要在 yarn-client 模式下运行,以便您运行的机器充当驱动程序。

对于 spark-submit,您将作业提交到集群,然后任务在集群中运行。通常你会在集群模式下运行,以便 YARN 可以将驱动程序分配给集群上具有可用资源的合适节点。

某些命令(如 .collect())会将所有数据发送到驱动节点,这可能会导致驱动节点在集群内部还是在集群外部的机器(例如用户笔记本电脑)上出现显着的性能差异.

【讨论】:

【参考方案2】:

对于学习目的,客户端模式已经足够好了。在生产环境中,您应该始终使用集群模式。

我会用一个例子来解释你。想象一下您想要启动多个应用程序的场景。假设您有一个包含节点 A、B、C、D、E 的 5 节点集群。

工作负载将分布在所有 5 个工作节点上,另外 1 个节点也用于提交作业(比如“A”用于此)。现在,每次使用客户端模式启动应用程序时,驱动程序进程始终在“A”上运行。

它可能适用于少数工作,但随着工作不断增加,“A”将缺乏 CPU 和内存等资源。

想象一下对运行多个此类作业的超大型集群的影响。

但是如果您选择集群模式,驱动程序每次都会在“A”上运行,但会分布在所有 5 个节点上。在这种情况下,资源得到了更均匀的利用。

希望这可以帮助您决定选择哪种模式。

【讨论】:

【参考方案3】:

客户端模式 - 用于交互式查询,您希望获得直接输出(本地机器或边缘节点)。这将在您启动应用程序的本地机器/边缘节点中运行驱动程序。

集群模式 - 此模式将帮助您在集群内启动驱动程序,无论您用于提交申请的机器如何。 YARN 将添加一个应用程序主控,该驱动程序将在其中创建并因此具有容错性。

【讨论】:

【参考方案4】:

这里是 一个link,非常简单明了。

在集群模式下,Spark 驱动程序在集群主机上的 ApplicationMaster 中运行。 YARN 容器中的单个进程负责驱动应用程序和从 YARN 请求资源。启动应用程序的客户端不需要在应用程序的整个生命周期内运行。

在客户端模式下,Spark 驱动程序在提交作业的主机上运行。 ApplicationMaster 只负责从 YARN 请求执行器容器。容器启动后,客户端与容器通信以安排工作。

【讨论】:

以上是关于spark-submit / spark-shell > yarn-client 和 yarn-cluster 模式的区别的主要内容,如果未能解决你的问题,请参考以下文章

大数据入门核心技术-Spark执行Spark任务的两种方式:spark-submit和spark-shell

spark-shell解析

spark安装与运行模式

spark-submit 执行scala代码

使用 spark-submit 无法从 hive 中找到表

spark提交参数解析