文章目录
- 1. Spark的主从结构
- 1.1 驱动器程序Driver
- 1.2 执行器程序Executor
- 2. 集群管理器概念区分
- 3. 运行流程小结
- Reference
本文是在阅读《Spark快速大数据分析》后,根据里面提到的知识点,对Spark的运行原理进行总结概括。
说明:这本书使用的spark版本是1.2,目前最新版本已经是3.0,所以可能笔记中有些内容在新版中已经不再适用。
1. Spark的主从结构
在分布式环境下,Spark 集群采用的是主/从结构。
在一个Spark集群中,有一个节点负责中央协调,调度各个分布式从节点。这个中央协调节点被称为驱动器(Driver)节点,与之对应的从节点被称为执行器(Executor)节点。
驱动器节点可以和大量的执行器节点进行通信,它们都作为独立的进程运行。驱动器节点和所有的执行器节点一起被称为一个 Spark 应用(Application)。
1.1 驱动器程序Driver
驱动器就是执行程序中main()方法的进程,包括创建SparkContext、创建RDD、对RDD进行转化和行动操作。
在Spark-shell中,当启动shell就是启动了一个Driver程序,其中已经生成了一个叫sc的SparkContext对象。
驱动器程序主要有两个功能——
- 把用户程序转为任务
驱动器程序将RDD的操作转化成一个由操作组成的逻辑上的有向无环图DAG,通过SparkContext中的DAGScheduler,将DAG中的RDD划分到不同的Stage,每个Stage由多个任务Task组成。
多个Stage构成一个Job,一个action操作会生成一个Job。
- 为执行器节点调度任务
驱动器进程对应用中所有的执行器节点有完整的记录。当任务划分后,驱动器程序会根据当前的执行器节点集合,尝试把所有任务基于数据所在位置分配给合适的执行器进程。
1.2 执行器程序Executor
执行器进程是一个可以处理任务Task和存储RDD数据的进程。执行器进程启动后,会向驱动器进程注册自己。因此,驱动器进程始终对应用中所有的执行器节点有完整的记录。
执行器程序主要有两个功能——
- 处理任务task
它们负责运行组成Spark应用的任务,并将结果返回给驱动器进程。
- 存储RDD数据
通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD 是直接缓存在执行器进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
2. 集群管理器概念区分
Spark应用可以运行在多种集群管理器上,如Spark原生的集群管理器Standalone、Hadoop的YARN、Apache Mesos等。关于这些模式下的Spark调度原理,在之前的笔记Spark学习—— (3) 运行模式Local,Standalone,YARN已经有过说明,这里摘抄下书中对概念的说法上的细节。
Spark 文档中始终使用驱动器节点和执行器节点的概念来描述执行 Spark 应用的进程,而**主节点(master)和工作节点(worker)**的概念则被用来分别表述集群管理器中的中心化的部分和分布式的部分。
例如,Hadoop YARN会启动一个叫作资源管理器(Resource Manager)的主节点守护进程,以及一系列叫作节点管理器(Node Manager)的工作节点守护进程。而在YARN的工作节点上,Spark不仅可以运行执行器进程,还可以运行驱动器进程。
每个应用在每个工作节点上最多拥有一个执行器进程,但是一台机器上可以运行多个工作节点。
3. 运行流程小结
上面介绍了Spark的主/从结构以及Driver、Executor的概念,这里简单总结集群上运行 Spark 应用的过程——
- 用户通过 spark-submit 脚本提交应用
- spark-submit 脚本启动驱动器程序,调用用户定义的 main() 方法
- 驱动器程序与集群管理器通信,申请资源以启动执行器节点
- 集群管理器为驱动器程序启动执行器节点
- 驱动器进程执行用户应用中的操作。根据程序中所定义的对 RDD 的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程
- 任务在执行器程序中进行计算并将结果发送至驱动器程序
- 如果驱动器程序的 main() 方法退出,或者调用了 SparkContext.stop(),驱动器程序会终止执行器进程,并且通过集群管理器释放资源
Reference
- Spark学习—— (1) 原理介绍
- Spark学习—— (3) 运行模式Local,Standalone,YARN
- 《Spark快速大数据分析》