我理解YARN上Spark应用的客户端模式和集群模式之间的主要区别。
主要差异包括
- 驱动程序在哪里运行 -客户端模式为本地,集群模式为应用程序主
- 客户端运行持续时间 -在客户端模式下,客户端需要运行整个持续时间,在集群模式下,客户端不需要运行,因为AM会照顾它
- 交互式使用 - spark shell和pyspark。集群模式不适合这些模式要求驱动程序在客户端 上运行
- 调度工作—在客户端模式下,客户端通过直接与容器通信来调度工作。在集群模式下,A通过直接与容器 通信来调度工作。
对于相似度
- 谁处理来自YARN的执行请求 -应用程序主程序
- 谁启动执行器进程 - YARN Node Manager
我的问题是-在现实世界的场景(生产环境),我们不需要交互模式,客户端不需要长时间运行-集群模式是一个明显的选择吗?
客户端模式有什么好处吗?
- 在客户端机器上运行驱动程序而不是AM
- 允许客户端调度工作,而不是AM
从文档中
一种常见的部署策略是从与您的工作人员物理上位于同一位置的网关机器机器(例如,独立EC2集群中的主节点)。在这个安装时,客户端模式是合适的。在客户端模式下,驱动程序为直接在客户端spark-submit进程中启动,使用连接到控制台的应用程序的输入和输出。因此,此模式特别适用于涉及REPL(例如Spark shell).或者,如果您的应用程序是从远在工作机器上(例如在本地的笔记本电脑上),这是很常见的使用集群模式来最小化驱动程序之间的网络延迟还有遗嘱执行人。请注意,目前不支持集群模式用于独立集群、Mesos集群或python应用程序。
看起来,主要原因是当我们从远程运行spark-submit时,为了减少执行器和驱动程序之间的延迟,首选集群模式
根据我的经验,在生产环境中,唯一合理的模式是集群模式,有两个例外:
- 当hadoop节点没有应用程序所需的资源时,例如:在执行结束时,spark job执行
ssh
到无法从hadoop节点访问的服务器 - 当你使用spark流,你想要优雅地关闭它(杀死集群模式应用程序强制流关闭,如果你在客户端模式下运行,你可以调用
ssc.stop(stopGracefully = true)