前几天大概了解了 Spark 是什么,没看过的可以点击下面的链接。今天开始正式学习 Spark。

1.Spark 运行环境

1.1 Local 模式

本地执行 Spark 代码的环境。用于调试、练习。

1.2 Standalone 模式

独立部署模式。Spark 自身提供计算资源。Spark 是计算框架,但自身资源调度不是它的强项。整体是 master-slave 架构。

1.3 Yarn 模式

使用 Yarn 作为资源调度框架,工作中使用最多。可以先点击下面的链接阅读之前的文章了解什么是 Yarn。
Yarn 资源调度器

1.4 K8S 模式

容器化部署十分流行,基于 Docker 运行应用,使用 Kubernetes(k8s)管理容器

1.5 Mesos 模式

使用较少。

1.6 Windows 模式

自己学习使用。

1.7 各种模式对比

模式需启动的进程所属者应用场景
LocalSpark测试
StandaloneMaster WorkerSpark独立部署
YarnYarn HDFSHadoop混合部署

2.Spark 运行架构

整体是 master-slave 架构。

Spark 运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进程(Executor)。其中,集群资源管理器可以是 Spark 自带的资源管理器,也可以是 YARN 或 Mesos 等资源管理框架。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBijF5wM-1651548437519)(C:\Users\zxy19\Documents\博客文章\组件\Spark\20220503\图片1.png)]

2.1 核心组件

2.1.1 Driver

Spark 驱动器节点,执行 Spark 任务中的 main 方法,负责实际代码的执行工作。

核心功能:

  • 将用户程序转换为作业(job);
  • 在 Executor 之间调度任务(task);
  • 跟踪 Executor 的执行情况;
  • 通过 UI 展示查询运行情况。
2.1.2 Executor

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

核心功能:

  • 负责运行具体任务(Task),并将结果返回给驱动器进程;
  • 通过自身的块管理器(Block Manager)用内存缓存的 RDD 。RDD 是直接缓存在 Executor 进程内的,缓存可以加速运算。
2.1.3 Master & Worker

Spark 集群的独立部署环境中,不依赖其他的资源调度框架,使用自的资源调度功能,所以环境中还有其他两个核心组件:Master 和 Worker。

  • Master 是负责资源调度和分配的进程,并进行集群的监控,类似于 Yarn 中的 RM;
  • Worker 具体执行处理和计算的进程,一个 Worker 运行在集群中的一台服务器上,由 Master 分配资源对数据进行并行的处理和计算,类似于 Yarn 环境中 NM。
2.1.4 ApplicationMaster

Hadoop 用户向 YARN 集群提交应用程序时,提交程序中应该包含 ApplicationMaster,用于向资源调度器申请执行任务的资源容器 Container,运行用户自己的程序任务job,监控整个任务的执行,跟踪整个任务的状态,处理任务失败等异常情况。具体可以看之前关于 Yarn 的文章。

ResourceManager(资源)和 Driver(计算)之间的解耦合靠的就是 ApplicationMaster。

2.2 核心概念

2.2.1 Executor 与 Core

Executor 是集群中运行在工作节点(Worker)中的一个 JVM 进程,是整个集群中的专门用于计算的节点。在提交应用中,可以提供参数指定计算节点的个数,以及对应的资源。这里的资源一般指的是工作节点 Executor 的内存大小和使用的虚拟 CPU 核(Core)数量。

2.2.2 并行度(Parallelism)

整个集群并行执行任务的数量称之为并行度。

2.2.3 有向无环图(DAG)

原始的 RDD 通过一系列的转换就就形成了 DAG。RDD 任务会切分 Application、Job、Stage 和 Task。由 Application→Job→Stage→Task每一层都是 1 对 n 的关系。

  • Application:初始化一个 SparkContext 即生成一个 Application;
  • Job:一个 Application 中以 Action 算子划分 Job,如 collect、saveAsTexFile、show;
  • Stage:一个 Job 中以 Shuffle 为边界划分 Stage,如 join、groupByKey、reduceByKey;
  • Task:每个 Stage 有一组 Task组成(TaskSet),Task 个数由输入文件的切片决定,将 Stage 划分的结果发送到不同的 Executor 执行即为一个 Task。

原始的 RDD 通过一系列的转换就就形成了 DAG,DAG 的点表示 RDD,边表示计算和操作。整个 DAG 描述了计算逻辑。

总结以下就是:DAG 并不是真正意义的图形,而是由 Spark 程序直接映射成的数据流的高级抽象模型。简单理解就是将整个程序计算的执行过程用图形表示出来,这样更直观,更便于理解,可以用于表示程序的拓扑结构。

3 Yarn 模式的提交流程

由于 Yarn 模式在工作中使用最多,所以这里讲解 Yarn 模式的提交流程。点击下方链接了解 Yarn 资源调度器。
Yarn 资源调度器

3.1 Yarn Client 模式

Client 模式 用于监控和调度的 Driver 模块在客户端(本地)执行,而不是在 Yarn 中,可以与集群进行调度和通讯,进行交互式作业。如果作业很多会造成 client 压力很大。

  • Driver 在任务提交的本地机器上运行;
  • Driver 启动后会和 ResourceManager 通讯申请启动 ApplicationMaster;
  • ResourceManager 分配 container,在合适的 NodeManager 上启动 ApplicationMaster,负责向 ResourceManager 申请 Executor 内存;
  • ResourceManager 接到 ApplicationMaster 的资源申请后会分配 container,然后 ApplicationMaster 在资源分配指定的 NodeManager 上启动 Executor 进程;
  • Executor 进程启动后会向 Driver 反向注册,Executor 全部注册完成后 Driver 开始执行 main 函数;
  • 之后执行到 Action 算子时,触发一个 Job,并根据宽依赖开始划分 stage,每个 stage 生成对应的 TaskSet,之后将 task 分发到各个 Executor 上执行。

3.2 Yarn Cluster 模式

Cluster 模式将用于监控和调度的 Driver 模块启动在 Yarn 集群资源中执行(运行在 AM 中)。一般应用于实际生产环境,提交完作业就可以关闭客户端,但无法交互式作业。

  • 任务提交后会和 ResourceManager 通讯申请启动 ApplicationMaster;
  • 随后 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 上执行。


欢迎关注。