Spark独立集群中的worker、executor和core是什么?

我读了集群模式概述,我仍然不能理解Spark独立集群和并行性中的不同进程。

worker是否是JVM进程?我运行bin\start-slave.sh并发现它衍生了worker,这实际上是一个JVM。

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

这些是我的问题:

  1. executor是每个应用程序。那么工人的角色是什么呢?它是否与执行程序协调并将结果反馈给驱动程序? 还是司机直接和执行人对话?如果是,那么工人的目的是什么?李< / p > < / >

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

  3. 任务可以在执行器中并行运行吗?如果是,如何配置执行器的线程数?

  4. worker、executor和executor cores(——total-executor-cores)之间的关系是什么?

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

更新

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

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

< >强例2 与示例1相同的集群配置,但我使用以下设置运行了一个应用程序 ——executor-cores 10 ——total-executor-cores 10 . < / p >

< >强例3 与示例1相同的集群配置,但我使用以下设置运行了一个应用程序 ——executor-cores 10 ——total-executor-cores 50。< / p >

< >强4示例 与示例1相同的集群配置,但我使用以下设置运行了一个应用程序 ——executor-cores 50 ——total-executor-cores 50。< / p >

< >强5的例子 与示例1相同的集群配置,但我使用以下设置运行了一个应用程序 ——executor-cores 50 ——total-executor-cores 10 . < / p >

在这些例子中, 有多少个执行人?每个执行器有多少线程?多少核? 如何决定每个应用程序的执行者数量?它总是和工人数量一样吗?< / p >

132667 次浏览

enter image description here

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

司机

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

执行人

执行器是工作节点的进程,负责在给定的Spark作业中运行单个任务。它们在Spark应用程序开始时启动,通常在应用程序的整个生命周期中运行。一旦它们运行了任务,就会将结果发送给驱动程序。它们还为用户程序通过块管理器缓存的rdd提供内存存储。

应用程序执行流程

考虑到这一点,当你用spark-submit向集群提交一个应用程序时,内部会发生这样的情况:

  1. 一个独立的应用程序启动并实例化一个SparkContext实例(只有当你可以将该应用程序称为驱动程序时)。
  2. 驱动程序向集群管理器请求资源以启动执行程序。
  3. 集群管理器启动执行程序。
  4. 驱动程序进程贯穿用户应用程序。根据rdd上的操作和转换,任务被发送到执行程序。
  5. 执行程序运行任务并保存结果。
  6. 如果任何worker崩溃,它的任务将被发送到不同的执行程序重新处理。在《学习Spark:闪电般快速的大数据分析》一书中,他们谈到了Spark和容错:

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

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

你的问题

  1. 当执行程序启动时,它们向驱动程序注册自己,从此它们直接通信。工作线程负责向集群管理器通报其资源的可用性。

  2. 在YARN集群中,可以使用——num-executors。在一个独立的集群中,每个worker只有一个executor,除非你使用spark.executor.cores,一个worker有足够的内核容纳多个executor。(正如@JacekLaskowski指出的,——num-executors在YARN中不再使用https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66)

  3. 您可以使用——executor-cores为每个执行程序分配内核数

  4. ——total-executor-cores是每个应用程序的最大executor内核数

  5. 正如Sean Owen在线程中所说:“没有一个好的理由在每台机器上运行一个以上的worker”。例如,在一台机器上有许多JVM。

更新

我还没能测试这个场景,但根据文档:

Spark将贪婪地获取调度程序提供的尽可能多的内核和执行器。所以最后你会得到5个8核的执行器。

例2至5: Spark不能在一个worker中分配足够多的内核,因此不会启动execuexecuors。

这是Apache Spark内部的工作方式:

enter image description here