对于运行在 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 应用,哪种部署方式更好——客户端还是集群的主要内容,如果未能解决你的问题,请参考以下文章