Spark 核心组件

Driver

Spark 驱动器节点,用于执行 Spark 任务中的 main 方法, 负责实际代码的执行工作。Driver 在 Spark 作业执行时主要负责:

  1. 将用户程序转化为任务[job]

  2. Executor 之间调度任务task

  3. 跟踪 Executor 的执行情况;

  4. 通过 UI 展示查询运行情况

Executor

Spark Executor 节点是一个 JVM 进程,负责在 Spark 作业中运行 具体 任务,任 务 彼此之 间相互独立。 Spark 应用启动时, Executor 节点被同时启动, 并且 始终伴 随着整个 Spark 应用的生命周期而存在。 如果有 Executor 节点发生了故障或崩溃 , Spark 应用也可以继续执行, 会将出错节点上的任务调度到其他 Executor 节点上继 续运行。

Executor 有两个核心功能:

  1. 负责运行组成 Spark 应用的任务,并将结果返回给 Driver 进程;

  2. 它们通过自身的块管理器( Block Manager )为用户程序中要求缓存的 RDD

运行流程概述

![image-20200131155431461](/Users/zxc/Library/Application Support/typora-user-images/image-20200131155431461.png)

Spark 部署模式

本地模式

Local[N] 模式,用单机的多个线程来模拟 Spark 分布式计算,直接运行在本地,便于调试,通常用来验证开发出来的应用程序逻辑上有没有问题。

其中 N 代表可以使用 N 个线程,每个线程拥有一个 core。如果不指定 N,则默认是1个线程,该线程有1个core。

  • local 只启动一个 executor
  • local[k] 启动 k 个executor
  • local[*] 启动 和 cpu 数目相同的 executor

Standalone 模式

独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。

Spark On Mesos 模式

Spark 运行在 Mesos 上会比运行在 YARN 上更加灵活,更加自然。目前在 Spark On Mesos 环境中,用户可选择两种调度模式之一运行自己的应用程序。

  • 粗粒度模式

    每个应用程序的运行环境由一个 Dirver 和若干个 Executor 组成,其中,每个 Executor 占用若干资源,内部可运行多个Task。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。

  • 细粒度模式

    鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos 还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。与粗粒度模式一样,应用程序启动时,先会启动executor,但每个 executor 占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos 会为每个 executor 动态分配资源,每分配一些,便可以运行一个新任务,单个 Task 运行完之后可以马上释放对应的资源。每个 Task 会汇报状态给 Mesos slave 和 Mesos Master ,便于更加细粒度管理和容错,这种调度模式类似于 MapReduce 调度模式,每个 Task 完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。

Spark On YARN 模式

目前仅支持粗粒度模式。这是由于 YARN 上的 Container 资源是不可以动态伸缩的,一旦 Container 启动之后,可使用的资源不能再发生变化,不过这个已经在 YARN 计划中了。

spark on yarn 的支持两种模式:

  1. yarn-cluster:适用于生产环境;
  2. yarn-client:适用于交互、调试,希望立即看到 app 的输出

yarn-cluster 和 yarn-client 的区别在于 yarn appMaster,每个 yarn app 实例有一个 appMaster进程,是为 app 启动的第一个 container

负责从 ResourceManager 请求资源,获取到资源后,告诉 NodeManager 为其启动 container。

运行机制

Standalone 模式运行机制

在 Standalone Client 模式下,Driver 在任务提交的本地机器上运行,Driver 启动后向 Master 注册应用程序,Master 根据 submit 脚本的资源需求找到内部资源至少可以启动一个 Executor 的所有 Worker ,然后在这些 Worker 之间分配 Executor ,Worker 上的 Executor 启动后会向 Driver 反向注册,所有的 Executor 注册完成后,Driver 开 始执行 main 函数, 之后执行到 Action 算子时 , 开始划分 stage , 每个 stage 生成对 应 的 taskSet , 之后将task 分发到各个 Executor 上执行。

YARN 模式运行机制

YARN Client 模式

在 YARN Client 模式下, Driver 在任务提交的本地机器上运行, Driver 启动后会和 ResourceManager 通讯申请启动 Application Master,随后 ResourceManager 分配 container , 在合适的 NodeManager 上启动 ApplicationMaster,此时的 ApplicationMaster 的功能相当于一个 Executor Laucher,只 负责向 ResourceManager 申请 Executor 内存 。

ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container,然后 ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 进程, Executor 进程启动后会向 Driver 反向注册, Executor 全部注册完成后 Driver 开始执行 main 函数,之后执行到 Action 算子时, 触发一个job,并根据宽依赖开始划分 stage , 每个 stage 生成对应的 taskSet,之后将 task 分发到各个 Executor 上执行 。

![屏幕快照 2020-03-23 上午12.33.41](/Users/zxc/Documents/hexo/source/_posts/Spark架构.assets/屏幕快照 2020-03-23 上午12.33.41.png)

YARN Cluster模式

在 Yarn-Cluster 模式中,当用户向 Yarn 中提交一个应用程序后, Yarn 将分两个阶段运行该应用程序:第一个阶段是把 Spark 的 Driver 作为一个 ApplicationMaster 在 Yarn 集群中先启动;第二个阶段是由 ApplicationMaster 创建应用程序,然后为它向 ResourceManager 申请资源,并启动 Executor 来运行 Task,同时监控它的整个运行过程,直到运行完成。

![屏幕快照 2020-03-23 上午12.27.59](/Users/zxc/Documents/hexo/source/_posts/Spark架构.assets/屏幕快照 2020-03-23 上午12.27.59.png)

在 YARNCluster 模式下,任务提交后会和 ResourceManager 通讯申请启动 Application Master , 随后 ResourceManager 分配 container, 在合适的 NodeManager 上启动 ApplicationMaster , 此时的 ApplicationMaster 就是 Driver 。

Driver 启动后 向 ResourceManager 申请 Executor 内存, ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container, 然后在合适的 NodeManager 上启动 Executor 进程, Executor 进程启动后会向 Driver 反向注册, Executor 全部注册完 成后 Driver 开始执行 main 函数,之后执行到 Action 算子时,触发一个 job ,并根据 宽依赖 开始划分 stage , 每个 stage 生成对应 的 taskSet , 之后将 task 分发到各个 Executor 上执行。