工作进程、工作进程实例和执行器之间的关系是什么?

88

Spark Standalone模式下,存在主节点和工作节点。

以下是几个问题:

  1. 2个工作实例是否意味着一个工作节点有2个工作进程?
  2. 每个工作实例是否持有特定应用程序的执行器(管理存储和任务),还是一个工作节点拥有一个执行器?
  3. 是否有流程图解释Spark如何在运行时工作,例如单词计数?
4个回答

73

在其他出色答案的基础上,我想用几张图片来描述。

在Spark Standalone模式下,有主节点和工作节点。

如果我们将独立模式下主节点和工作节点(每个工作节点如果CPU和内存可用可以有多个执行器)表示在一个地方。

Spark Standalone mode

如果您想知道Spark如何与YARN一起使用,请查看此帖子Spark on YARN

1.两个工作实例是指一个工作节点具有两个工作进程吗?

通常情况下,我们将工作实例称为从节点,因为它是执行Spark任务/作业的进程。对于一个节点(物理或虚拟机)和一个worker的建议映射如下:

1 Node = 1 Worker process

2.每个工作实例是否都持有特定应用程序的执行器(管理存储、任务),还是一个工作节点只持有一个执行器?

是的,如果具备足够的CPU、内存和存储空间,一个工作节点可以持有多个执行器(进程)。

请参考给定图像中的工作节点。 A Worker node in a cluster

顺便说一句,在某个时间点上,一个工作节点中的执行器数量完全取决于集群上的工作负载以及节点运行多少执行器的能力。

3. 是否有一张流程图解释Spark运行时?

如果我们从Spark角度来看一个程序在任何资源管理器上的执行,它会join两个rdd并进行一些reduce操作,然后进行filter

Spark runtime for a sample code

希望对你有所帮助。


1
非常好而且详细的回答,可惜发帖者已经接受了一个答案。 - botengboteng
1
非常好的帖子 - 谢谢!有一个问题:您说“建议将节点(物理或虚拟机器)和工作程序映射为1个节点= 1个工作进程”。但是在spark.apache.org/docs/latest/hardware-provisioning.html上的Spark文档中指出,“请注意,Java VM并不总是能够处理超过200 GB RAM。如果您购买的机器具有更多RAM,则可以在每个节点上运行多个工作程序JVM。”那么,您的建议是否假定了此JVM RAM限制?还是(正如我所怀疑的那样),这个RAM限制基于旧的JVM,它们对其内存收集的鲁棒性稍微差一些? - Brian
@Brian:我认为,JVM(尤其是堆)的内存越大,GC发生时暂停的时间就会越长。很抱歉回复晚了,不知何故错过了您的评论。 - mrsrinivas
这是一个很好的建议,我更新了答案。我原本以为第二张图片会更多地解释工人的情况。 - mrsrinivas

62

我建议先阅读Spark集群文档,更重要的是阅读这篇Cloudera博客文章,解释了这些模式。

您的第一个问题取决于您所指的“实例”的含义。一个节点是一台机器,运行多个worker没有必要,因此两个worker节点通常意味着两台机器,每台机器上有一个Spark worker。

Worker保存许多执行器,用于许多应用程序。一个应用程序在多个worker上具有执行器。

您的第三个问题不清楚。


8
  1. 第一个问题来自于 spark-env.sh:SPARK_WORKER_INSTANCES,用于设置每个节点上的工作进程数。
  2. StandaloneExecutorBackend 这个类别被称为执行器(Executor)吗?
  3. 你能否通过图片解释 Spark 内部的 WordCount 实现以及数据如何在不同节点间传输?
- edwardsbean
一个节点就是一台机器,没有充分的理由在同一台机器上运行多个工作进程。为什么这么说呢?您能否解释一下?如果一个节点有足够的内存,它可以在同一台机器上拥有2个或更多的执行器。 - Neethu Lalitha
1
其他条件相同的情况下,让一个进程管理所有这些资源比两个进程更好。我能想到的例外情况有一些极端情况——如果你有256GB的内存,你可能不想要一个256GB的单JVM堆,因为例如GC可能需要一段时间。或者你可能有一些非线程安全的本地库,需要你每个执行器运行一个任务,因此需要多个执行器。但这些都是例外情况。 - Sean Owen
1
Cloudera博客链接已损坏,请使用此链接:https://web.archive.org/web/20160221195329/http://blog.cloudera.com/blog/2014/05/apache-spark-resource-management-and-yarn-app-models/。 - Voilin

33
我知道这是一个老问题,Sean的回答很好。我的写作是关于MrQuestion评论中的 SPARK_WORKER_INSTANCES 。如果您使用Mesos或YARN作为集群管理器,则可以在同一台机器上使用一个工作程序运行多个执行程序,因此实际上没有必要在每台物理机器上运行多个工作程序。然而,如果您使用独立的群集管理器,它目前仍然只允许每个物理机器上的每个工作程序进程运行一个执行程序。因此,在您拥有超大型机器并希望在其中运行多个执行程序的情况下,您必须启动多个工作程序进程。这就是 spark-env.sh 中的 SPARK_WORKER_INSTANCES 用途。默认值为1。如果您使用此设置,请确保明确设置 SPARK_WORKER_CORES 以限制每个工作程序的核心数,否则每个工作程序将尝试使用所有核心。
这个独立的群集管理器限制很快就会消失。根据此 SPARK-1706 ,此问题将在Spark 1.4中得到解决和发布。

那么在最新的Spark版本中,它是如何工作的呢?我可以通过设置执行器的核心数来操纵工作人员的数量。例如,如果工作人员有16个核心,而我将执行器核心设置为4,那么每个工作人员会有4个执行器吗?我最近问了这样的问题,你可能已经回答了,https://stackoverflow.com/questions/54364403/how-multiple-executors-are-managed-on-the-worker-nodes-with-a-spark-standalone-c - MetallicPriest

8
正如Lan所说,使用多个工作实例仅在独立模式下才相关。有两个原因需要多个实例:(1)垃圾暂停收集器可能会对大型JVM的吞吐量产生影响 (2)堆大小>32 GB无法使用CompressedOoops。
了解更多关于如何设置多个工作实例的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接