Apache spark Spark独立集群中的工作者、执行者和核心是什么?

Apache spark Spark独立集群中的工作者、执行者和核心是什么?,apache-spark,distributed-computing,Apache Spark,Distributed Computing,我读过,但仍然无法理解Spark Standalone集群中的不同进程以及并行性 工人是否是JVM进程?我运行了bin\start slave.sh,发现它产生了worker,它实际上是一个JVM 根据上面的链接,executor是为运行任务的工作节点上的应用程序启动的进程。执行器也是一个JVM 以下是我的问题: 每个申请都有执行人。那么,工人的角色是什么?它是否与执行者协调并将结果反馈给驾驶员? 还是司机直接与遗嘱执行人交谈?如果是,工人的目的是什么 如何控制应用程序的执行者数量 任务能否在执

我读过,但仍然无法理解Spark Standalone集群中的不同进程以及并行性

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

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

以下是我的问题:

  • 每个申请都有执行人。那么,工人的角色是什么?它是否与执行者协调并将结果反馈给驾驶员? 还是司机直接与遗嘱执行人交谈?如果是,工人的目的是什么

  • 如何控制应用程序的执行者数量

  • 任务能否在执行器内并行运行?如果是,如何配置执行器的线程数

  • 工作者、执行者和执行者核心之间的关系是什么(总执行者核心)

  • 每个节点有更多的工作人员意味着什么

  • 已更新

    让我们举一些例子来更好地理解

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

    示例2 与示例1相同的集群配置,但我使用以下设置运行应用程序 --执行器核心10 --执行器核心总数为10

    示例3 与示例1相同的集群配置,但我使用以下设置运行应用程序 --执行器核心10 --执行器核心总数为50

    示例4 与示例1相同的集群配置,但我使用以下设置运行应用程序 --执行器核心50 --执行器核心总数为50

    示例5 与示例1相同的集群配置,但我使用以下设置运行应用程序 --执行器核心50 --执行器核心总数为10

    在每一个例子中, 有多少遗嘱执行人?每个执行器有多少线程?有多少核? 如何确定每份申请的执行人数量?它总是和工人的数量一样吗?

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

    驱动程序

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

    执行人

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

    应用程序执行流程

    考虑到这一点,当您使用spark submit向集群提交应用程序时,内部会发生以下情况:

  • 一个独立的应用程序启动并实例化一个
    SparkContext
    实例(只有在那时,您才能将该应用程序称为驱动程序)
  • 驱动程序向群集管理器请求资源以启动执行器
  • 集群管理器启动执行器
  • 驱动程序进程在用户应用程序中运行。根据RDDs上的操作和转换,任务被发送给执行者
  • 执行者运行任务并保存结果
  • 如果任何工作进程崩溃,它的任务将被发送给不同的执行者,以便再次处理。在《学习火花:闪电般的大数据分析》一书中,他们谈到了火花和容错:
  • Spark通过重新执行失败或缓慢的任务自动处理失败或缓慢的机器。例如,如果运行map()操作分区的节点崩溃,Spark将在另一个节点上重新运行它;即使该节点没有崩溃,但只是比其他节点慢得多,Spark也可以在另一个节点上先发制人地启动任务的“推测”副本,并在任务完成后获取其结果

  • 使用驱动程序中的SparkContext.stop(),或者如果主方法退出/崩溃,所有执行器都将被终止,集群管理器将释放集群资源 您的问题

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

  • 在纱线集群中,您可以使用--num执行器来实现这一点。在独立集群中,除非您使用spark.executor.cores,并且一个worker具有足够的内核来容纳多个执行器,否则每个worker将获得一个执行器。(正如@JacekLaskowski所指出的,--num执行器不再用于纱线)

  • 您可以使用--executor cores为每个执行器分配核心数

  • --total executor cores是每个应用程序的最大执行器核心数

  • 正如肖恩·欧文(Sean Owen)在这篇文章中所说:“没有一个很好的理由让每台机器运行一个以上的工人”。例如,在一台机器中会有许多JVM

  • 更新

    我无法测试此场景,但根据文档:

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

    示例2至5:Spark无法在单个辅助进程中分配所需的核数,h