40

TL;DR:在 Spark Standalone 集群中,客户端和集群部署模式有什么区别?如何设置我的应用程序将在哪种模式下运行?


我们有一个包含三台机器的 Spark Standalone 集群,它们都使用 Spark 1.6.1:

  • 一台主机,这也是我们的应用程序运行的地方spark-submit
  • 2台相同的工人机器

Spark 文档中,我读到:

(...) 对于独立集群,Spark 目前支持两种部署模式。在客户端模式下,驱动程序与提交应用程序的客户端在同一进程中启动。然而,在集群模式下,驱动程序是从集群内的一个 Worker 进程启动的,并且客户端进程在完成提交应用程序的职责后立即退出,而无需等待应用程序完成。

但是,通过阅读本文,我并没有真正了解实际差异,也不知道不同部署模式的优缺点是什么。

此外,当我使用 start-submit 启动我的应用程序时,即使我将属性设置spark.submit.deployMode为“cluster”,我的上下文的 Spark UI 也会显示以下条目:

上下文用户界面

所以我无法测试这两种模式以查看实际差异。话虽如此,我的问题是:

1)Spark Standalone客户端部署模式和集群部署模式的实际区别是什么?使用每一个的优点和缺点是什么?

2)我如何选择我的应用程序将在哪一个上运行,使用spark-submit

4

3 回答 3

68

Spark Standalone 客户端部署模式和集群部署模式之间的实际区别是什么?使用每一个的优点和缺点是什么?

让我们尝试看看客户端模式和集群模式之间的区别。

客户:

  • 驱动程序在专用进程内的专用服务器(主节点)上运行。这意味着它拥有所有可用资源来执行工作。
  • Driver 打开一个专用的 Netty HTTP 服务器并将指定的 JAR 文件分发给所有 Worker 节点(很大的优势)。
  • 因为主节点有它自己的专用资源,你不需要为驱动程序“花费”工作资源。
  • 如果驱动程序进程死亡,您需要一个外部监控系统来重置它的执行。

簇:

  • 驱动程序在集群的其中一个 Worker 节点上运行。工人由Master领导选择
  • Driver在 Worker中作为一个专用的独立进程运行。
  • 驱动程序至少占用1 个内核和来自其中一个工作人员的专用内存量(可以配置)。
  • 可以使用该--supervise标志从主节点监控驱动程序,并在它死亡时重置。
  • 在集群模式下工作时,与应用程序执行相关的所有 JAR 都需要对所有工作人员公开可用。这意味着您可以手动将它们放置在共享位置或每个工作人员的文件夹中。

哪一个更好?不确定,这实际上是由你来试验和决定的。这不是更好的决定,您从前者和后者中获得好处,由您决定哪个更适合您的用例。

如何选择我的应用程序将在哪一个上运行,使用spark-submit

选择运行模式的方法是使用--deploy-mode标志。从Spark 配置页面:

/bin/spark-submit \
  --class <main-class>
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]
于 2016-05-04T12:53:00.467 回答
6

假设您将通过对主节点执行 SSH 在 EMR 中执行 spark 提交。如果您提供选项 --deploy-mode cluster,则会发生以下情况。

  1. 您将无法在终端中看到详细的日志。
  2. 由于驱动程序不是在 Master 本身中创建的,因此您将无法从终端终止作业。

但在 --deploy-mode 客户端的情况下:

  1. 您将能够在终端中看到详细的日志。
  2. 您将能够从终端本身终止作业。

这些是我到目前为止注意到的基本内容。

于 2018-07-09T07:04:38.173 回答
0

我也有同样的情况,这里主节点使用独立的 ec2 集群。在此设置中客户端模式是合适的。在此驱动程序中,直接在作为集群客户端的 spark-submit 进程中启动。应用程序的输入和输出附加到控制台。因此,这种模式特别适用于涉及 REPL 的应用程序。

否则,如果您的应用程序是从远离工作机器的机器提交的,那么使用集群模式来最小化黑白驱动程序和执行程序的网络延迟是很常见的。

于 2017-07-26T04:39:38.133 回答