对于运行在 YARN 上的 spark 应用,哪种部署方式更好——客户端还是集群

Posted

技术标签:

【中文标题】对于运行在 YARN 上的 spark 应用,哪种部署方式更好——客户端还是集群【英文标题】:For spark applications running on YARN, which deploy mode is better - client or cluster 【发布时间】:2017-03-16 08:49:18 【问题描述】:

我了解 YARN 上 Spark 应用程序的客户端模式和集群模式之间的主要区别。

主要区别包括

    驱动在哪里运行 - 本地在clinet模式,Application Master在集群模式 客户端运行时长 - 在 clinet 模式下,客户端需要运行整个时长, 在集群模式下,客户端不需要运行,因为 AM 会处理它 交互式使用 - spark shell 和 pyspark。集群模式不适合这些 要求驱动在客户端运行 安排工作 - 在客户端模式下,客户端通过直接与容器通信来安排工作。 在集群模式下,A 通过直接与容器通信来调度工作

在这两种情况下的相似之处

    谁处理来自 YARN 的 executor 请求 - 应用程序主控 谁启动执行器进程 - YARN 节点管理器

我的问题是 - 在现实世界场景(生产环境)中,我们不需要交互模式,客户端不需要长时间运行 - 集群模式是一个明显的选择吗?

客户端模式有什么好处吗,例如:

在客户端机器而不是 AM 上运行驱动程序 允许客户安排工作,而不是上午

【问题讨论】:

【参考方案1】:

根据我的经验,在生产环境中唯一合理的模式是集群模式,但有两个例外:

当 hadoop 节点没有应用程序所需的资源时,例如:在执行结束时,spark 作业对无法从 hadoop 节点访问的服务器执行ssh 当你使用 spark 流并且你想优雅地关闭它(杀死集群模式应用程序会强制流关闭,如果你在客户端模式下运行,你可以调用ssc.stop(stopGracefully = true)

【讨论】:

【参考方案2】:

从文档中,

一种常见的部署策略是从 与您的工作人员物理上位于同一位置的网关机器 机器(例如独立 EC2 集群中的主节点)。在这个 设置,客户端模式是合适的。在客户端模式下,驱动程序是 直接在客户端 spark-submit 过程中启动,使用 附加到控制台的应用程序的输入和输出。因此, 这种模式特别适用于涉及的应用程序 REPL(例如 Spark shell)。

或者,如果您的申请是从远处的机器提交的 来自工作机器(例如,在您的笔记本电脑上本地),这很常见 使用集群模式来最小化驱动程序之间的网络延迟 和执行人。请注意,目前不支持集群模式 适用于独立集群、Mesos 集群或 python 应用程序。

看起来,主要原因是当我们从远程运行 spark-submit 时,为了减少执行程序和驱动程序之间的延迟,首选集群模式。

【讨论】:

以上是关于对于运行在 YARN 上的 spark 应用,哪种部署方式更好——客户端还是集群的主要内容,如果未能解决你的问题,请参考以下文章

译Yarn上常驻Spark-Streaming程序调优

YARN 集群上的 PySpark 分布式处理

Spark On Yarn如何查看任务日志

对于 YARN 中的单个队列,如何将 state=RUNNING 中的 spark 应用程序数量限制为 1?

spark系统实现yarn资源的自动调度

Spark on Yarn 流程