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

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

工作人员是否是JVMstream程? 我运行了bin\start-slave.sh ,发现它产生了一个实际上是JVM的worker。

根据上述链接,执行程序是在运行任务的工作节点上为应用程序启动的进程。 执行者也是一个JVM。

这些是我的问题:

  1. 执行程序是每个应用程序。 那么,一个工人的angular色是什么? 是否与执行者协调并将结果传回司机? 还是司机直接与执行人谈话? 如果是这样,那么工人的目的是什么?

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

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

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

  2. 每节点有更多的工人意味着什么?

更新

让我们举例来更好地理解。

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

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

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

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

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

在每个例子中,有多less个执行者? 每个执行器有多less个线程? 多less个核心? 执行者的数量是如何决定的? 它是否总是和工人的数量一样?

在这里输入图像说明

Spark使用主/从架构。 如图所示,它有一个中央协调员(司机),与许多分布式工作人员(执行者)进行交stream。 驱动程序和每个执行者都在自己的Java进程中运行。

DRIVER

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

遗嘱执行人

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

应用执行stream程

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

  1. 独立应用程序启动并实例化一个SparkContext实例(并且只有当您可以调用该应用程序时才是驱动程序)。
  2. 驱动程序要求集群pipe理器启动执行程序。
  3. 集群pipe理器启动执行程序。
  4. 驱动程序进程通过用户应用程序运行。 根据RDD的操作和转换,任务被发送给执行者。
  5. 执行者运行任务并保存结果。
  6. 如果有任何工作人员崩溃,其任务将被发送给不同的执行者再次处理。 在“学习火花:闪电般快速的大数据分析”一书中,他们谈到了Spark和Fault Tolerance:

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

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

你的问题

  1. 当执行者开始时,他们自己向驾驶员注册,从而直接沟通。 工作人员负责与集群pipe理员沟通资源的可用性。

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

  3. 您可以使用–executor-cores分配每个执行程序的核心数

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

  5. 正如肖恩·欧文(Sean Owen)在这篇文章中所说的那样:“每台机器上运行一个以上的员工并不是一个好理由”。 例如,你将有许多JVM坐在一台机器上。

UPDATE

我还没有能够testing这种情况,但根据文件:

例1: Spark将贪婪地获取调度器所提供的核心和执行器。 所以最后你会得到5个执行者,每个8个核心。

例2至5: Spark不能按照单个工作人员的要求分配尽可能多的内核,因此不会启动执行程序。