什么是Spark Standalone集群中的工作者,执行者,核心?


219

我阅读了《集群模式概述》,但仍然无法理解Spark Standalone集群中的不同进程和并行性。

工作者是不是JVM进程?我运行bin\start-slave.sh,发现它产生了工作程序,该工作程序实际上是一个JVM。

按照上面的链接,执行程序是为运行任务的工作程序节点上的应用程序启动的进程。执行者也是JVM。

这些是我的问题:

  1. 执行器是每个应用程序。那么,工人的角色是什么?它是否与执行程序协调并将结果传达给驱动程序?还是驾驶员直接与执行者对话?如果是这样,那么工人的目的是什么?

  2. 如何控制应用程序的执行者数量?

  3. 可以使任务在执行程序内部并行运行吗?如果是这样,如何配置执行程序的线程数?

  4. 工作者,执行者和执行者核心(--total-executor-cores)之间是什么关系?

  5. 每个节点上有更多工人意味着什么?

更新

让我们以例子来更好地理解。

示例1: 具有5个工作节点(每个节点具有8个核心)的独立群集当我使用默认设置启动应用程序时。

示例2 与示例1相同的群集配置,但是我运行具有以下设置的应用程序--executor-cores 10 --total-executor-cores 10。

示例3 与示例1相同的群集配置,但是我运行具有以下设置的应用程序--executor-cores 10 --total-executor-cores 50。

示例4 与示例1相同的群集配置,但是我运行具有以下设置的应用程序--executor-cores 50 --total-executor-cores 50。

示例5 与示例1相同的群集配置,但是我运行具有以下设置的应用程序--executor-cores 50 --total-executor-cores 10。

在每个示例中,有多少执行者?每个执行程序有多少个线程?多少个核心?如何确定每个申请的执行人数量?它总是与工人人数相同吗?

Answers:


274

在此处输入图片说明

Spark使用主/从架构。正如您在图中所看到的,它具有一个中央协调器(Driver),可与许多分布式工作人员(执行者)进行通信。驱动程序和每个执行程序都在各自的Java进程中运行。

驱动器

驱动程序是运行主要方法的过程。首先,它将用户程序转换为任务,然后将任务计划在执行程序上。

执行者

执行程序是工作程序节点的进程,负责在给定的Spark作业中运行单个任务。它们在Spark应用程序的开始时启动,通常在应用程序的整个生命周期内运行。运行任务后,他们会将结果发送给驱动程序。它们还为RDD提供内存存储,这些RDD由用户程序通过Block Manager缓存。

应用执行流程

考虑到这一点,当您使用spark-submit提交应用程序到集群时,这是内部发生的事情:

  1. 一个独立的应用程序将启动并实例化一个SparkContext实例(只有在您可以将该应用程序称为驱动程序时才如此)。
  2. 驱动程序向集群管理器请求资源以启动执行程序。
  3. 集群管理器启动执行程序。
  4. 驱动程序过程贯穿用户应用程序。根据RDD上的操作和转换,任务将发送给执行者。
  5. 执行程序运行任务并保存结果。
  6. 如果有任何工人崩溃,则其任务将被发送到不同的执行者以再次处理。在“学习Spark:闪电般的快速大数据分析”一书中,他们谈论了Spark和容错:

通过重新执行失败或缓慢的任务,Spark自动处理失败或缓慢的机器。例如,如果运行map()操作分区的节点崩溃,Spark将在另一个节点上重新运行它;即使该节点没有崩溃,但比其他节点慢得多,Spark仍可以抢先在另一个节点上启动任务的“推测”副本,并在完成时获取其结果。

  1. 使用驱动程序中的SparkContext.stop()或如果主方法退出/崩溃,则所有执行程序将终止,并且群集管理器将释放群集资源。

你的问题

  1. 执行程序启动时,他们向驱动程序注册自己,并由此直接进行通信。工作人员负责向集群管理器传达其资源的可用性。

  2. 在YARN群集中,您可以使用--num-executors来实现。在独立集群中,除非您使用spark.executor.cores且一个工作人员具有足够的内核来容纳一个以上的执行程序,否则每个工作人员将获得一个执行程序。(正如@JacekLaskowski所指出的那样,YARN中不再使用--num-executors https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66

  3. 您可以使用--executor-cores分配每个执行者的内核数

  4. --total-executor-cores是每个应用程序的最大执行者核心数

  5. 正如肖恩·欧文(Sean Owen)在此主题中所说:“没有充分的理由在每台计算机上运行多个工人”。例如,您将有许多JVM放在一台机器上。

更新

我无法测试这种情况,但是根据文档:

示例1: Spark将贪婪地获取调度程序提供的尽可能多的内核和执行程序。因此最终您将获得5个执行器,每个执行器具有8个核心。

示例2到5: Spark将无法在单个worker中分配所需数量的内核,因此将不会启动执行程序。


谢谢@Marco。因此,通常情况下,人们不应该担心工作线程上的堆内存,因为它只管理节点资源吗?
Manikandan Kannan 2015年

8
真是个好答案!谢谢@Marco。根据github.com/apache/spark/commit/… --num-executors在YARN中不再使用。
Jacek Laskowski 2015年

1
@Marco感谢您的出色回答。驱动程序运行时,您能否扩展集群管理器的角色?...它必须处理驾驶员或工人或两者都崩溃或停止响应的情况,以了解可用资源。
伊恩

1
@lain驱动程序联系集群管理器以分配资源,并且还请求集群mgr启动执行程序
Aravind Yarram


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.