Spark运行架构
- Spark框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构
图形中的Driver表示master,负责管理整个集群中的作业任务调度。 图形中的Executor 则是 slave,负责实际执行任务。
核心组件
由上图可以看出,对于Spark框架有两个核心组件:
1. Driver
- Driver就是驱动器节点,用于执行Spark任务中的main方法,触发整个任务执行。
- Driver在Spark作业执行时主要负责:
a) 将用户程序转化为作业(job) b) 在Executor之间调度任务(task) c) 跟踪Executor的执行情况 d) 通过UI展示查询运行情况
2. Executor
-
Executor是集群中工作节点(Worker)中的一个JVM进程 -
负责在 Spark 作业中执行具体任务(Task),任务彼此之间相互独立。 -
Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。 -
如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,Driver会将任务调度到其他Executor节点上继续运行。 -
Executor有两个核心功能: a) 负责运行组成Spark应用的任务,并将结果返回给Driver端 b) 自身的块管理器(Block Manager)可以为用户程序中要求缓存的 RDD 提供内存式存储。RDD 是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
3. Master & Worker
- Master和Worker是standalone模式下的核心组件
- Master是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于Yarn环境中的RM
- Worker呢,也是进程,一个Worker运行在集群中的一台服务器上,由Master分配资源对数据进行并行的处理和计算,类似于Yarn环境中NM。
4. ApplicationMaster
- Driver和Executor是计算相关组件
- Master和worker是资源相关组件
- 计算和资源想要交互,如果直接交互,Driver和Master直接交互,耦合度高,为了解耦,在中间加了ApplicationMaster,当Driver需要资源来做计算,委托AM向worker申请资源
核心概念
Executor与Core
- Spark Executor是集群中运行在工作节点(Worker)中的一个JVM进程
- 在提交应用中,可以提供参数指定Executor的个数,以及对应的内存和CPU core数量
注意:如果core个数超过了机器的core个数,那么其底层就是并发执行,并非并行执行;
2.并行度(Parallelism)
- 整个集群并行执行的任务数量称之为并行度;
- 并行执行指的是任务由不同的CPU执行。任务分布在不同的节点,即便每个机器是单线程,这也保证了多任务可以并行执行。
3. 有向无环图(DAG)
将Spark程序直接映射成的数据流的高级抽象模型。简单理解就是将整个程序计算的执行过程用图形表示出来,这样更直观,更便于理解,可以用于表示程序的拓扑结构。 箭头的方向是依赖方向,A->B,A依赖B,构成拓扑图形,但是不能闭环。 以Maven中依赖为例,A项目依赖于B项目,意味着A项目需要用Maven仓库中B项目的jar包,A要运行必须等B打包完。如果闭环,就永远无法执行 同样的道理也适用于Spark中任务的执行,DAG的作用是体现任务的调度顺序。
- 初代计算引擎:Hadoop所承载的MapReduce,它将计算分为两个阶段,分别为 Map阶段 和 Reduce阶段。对于上层应用来说,就不得不想方设法去拆分算法,甚至于不得不在上层应用实现多个 Job 的串联,以完成一个完整的算法,例如迭代计算。 由于这样的弊端,催生了支持 DAG 框架的产生。
- 支持 DAG 的框架被划分为第二代计算引擎。如 Tez 以及更上层的 Oozie。这里我们不去细究各种 DAG 实现之间的区别,不过对于当时的 Tez 和 Oozie 来说,大多还是批处理的任务。
- 接下来就是以 Spark 为代表的第三代的计算引擎。第三代计算引擎的特点主要是 Job 内部的 DAG 支持(不跨越 Job),以及实时计算。
4. 提交流程
(1)两条主线,资源申请和计算准备 (2)Spark应用程序提交到Yarn环境中执行的时候,一般会有两种部署执行的方式:Client和Cluster。 两种模式主要区别在于:Driver程序的运行节点位置。 基本原则:Driver运行在集群里面,就是Cluster,运行在集群外就是Client模式
|