Spark是一个基于内存的用于处理、分析大数据的集群计算框架。Spark最初由美国加州大学伯克利分校(UC Berkelely)的AMP(Algorithm,Machines and People)实验室与2009年开发,是基于内存计算的大数据并行计算框架,可以用于构建大型的、低延迟的数据分析应用程序。
1.Spark概述
Spark是一个基于内存的用于处理、分析大数据的集群计算框架。它提供了一套简单的编程接口,从而使得应用程序开发者方便使用集群节点的CPU、内存、存储资源来处理大数据。以下是伯克利分校的Spark数据分析架构图:
可以看出Spark是专注于数据的处理分析,而数据的存储还是要借助于Hadoop分布式文件系统HDFS、Amazon S3等实现,Spark生态系统可以与Hadoop生态系统有着很好的兼容。
2.Spark调度管理基本概念
2.1 Application
基于Spark的应用程序,由一个或多个作业组成。每个应用程序的执行涉及Driver Program
和集群上的Executors
两部分。
Spark application execution involves runtime concepts such as driver, executor, task, job, and stage. Understanding these concepts is vital for writing fast and resource efficient Spark programs.
2.2 Driver Program
Driver Program
中包含了启动运行函数main函数
和一个SparkContext类型的实例
。SparkContext
实例是Application
与Spark集群进行交互的唯一通道,是每一个Application
的入口。Driver Program
可以运行在任何可以提交作业的节点上(Work
,Master
),并不是必须运行在Master
节点上。在实际生产环境中为了减少Master
的负担,尽量避免在Master
上提交Driver Program
。(Spark2.0之后将SparkContext改为SparkSession
)
Spark applications run as independent sets of processes on a cluster, coordinated by the
SparkContext
object in your main program (called the driver program).
2.3 Worker
Worker
是Spark集群中任何可以运行Application
相关代码的节点。
2.4 Executor
Executor
是Worker
上某个Application
启动的一个进程,该进程负责执行Task
任务并且负责将数据存储在内存或者磁盘中。Executor
拥有CPU和内存资源,它是资源管理系统能够给予的最小单位。一个Worker
节点上可能有多个Executor
,但是每个Executor
中仅执行一个Application
对应的任务。也就是说,不同的Application
通过Executor
无法共享数据。
A process launched for an application on a worker node, that runs tasks and keeps data in memory or disk storage across them. Each application has its own executors.
2.5 Task
Task
即任务,是被送到Executor
上执行的工作单元。RDD
中的每个分区都对应相应的Task,而每个Task
对应于Executor
中的一个线程,这使得系统更加轻量级,Task
之间切换时间延迟更短。
A unit of work that will be sent to one executor
2.6 Job
Job
即作业,是包含多个Task
的并行计算,其与Application
中的执行操作一一对应,也就是说Application
每提交一个执行操作Spark
对应生成一个Job
。
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g.
save
,collect
); you'll see this term used in the driver's logs.
2.7 Stage
通常执行操作之前会有若干转换操作,而每个转换操作意味着父RDD到子RDD的转换,因此一个Job中通常涉及多个RDD。将Job中涉及的RDD进行分组,每组称为一个Stage
。
Each job gets divided into smaller sets of tasks called stages that depend on each other (similar to the map and reduce stages in MapReduce); you'll see this term used in the driver's logs.
2.8 DAG
DAG
是Directed Acyclic Graph
(有向无环图)的简称,反映RDD之间的依赖关系。
2.9 Cluster Manager
是在集群上获取资源的外部服务。若是Standalone
模式的Spark集群,Cluster Manager
即为Master
;若是基于YARN
模式Spark集群,Cluster Manager
即为Resource Manager
。
3.Spark架构设计
Spark运行架构包括集群资源管理器(Cluster Manager
)、运行作业任务的工作节点(Worker Node
)、每个应用的任务控制节点(Driver
)和每个工作节点上负责具体任务的执行进程(Executor
),资源管理器可以自带或Mesos
或YARN
。与Hadoop MapReduce
计算框架相比,Spark所采用的Executor有
两个优点:
- 1、是利用多线程来执行具体的任务,减少任务的启动开销
- 2、是
Executor
中有一个BlockManager
存储模块,会将内存和磁盘共同作为存储设备,有效减少IO开销
一个Application
由一个Driver
和若干个Job
构成,一个Job
由多个Stage
构成,一个Stage
由多个没有Shuffle
关系的Task组成。
当执行一个Application
时,Driver
会向集群管理器申请资源,启动Executor
,并向Executor
发送应用程序代码和文件,然后在Executor
上执行Task
,运行结束后,执行结果会返回给Driver
,或者写到HDFS
或者其他数据库中。
4.Spark运行基本流程
Spark运行的基本流程如下所示:
- 1、当一个Spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(
Driver
)创建一个SparkContext
,由SparkContext
负责和资源管理器(Cluster Manager
)的通信以及进行资源的申请、任务的分配和监控等。SparkContext
会向资源管理器注册并申请运行Executor
的资源。 - 2、资源管理器为
Executor
分配资源,并启动Executor
进程,Executor
运行情况将随着“心跳”发送到资源管理器上。 - 3、
SparkContext
根据RDD的依赖关系构建DAG图
,DAG图
提交给DAG调度器(DAGScheduler
)进行解析,将DAG图分解为多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler
)进行处理;Executor
向SparkContext
申请任务,任务调度器将任务分发给Executor
运行,同时SparkContext
将应用程序代码发放给Executor
。 - 4、任务在
Executor
上运行,把执行结果反馈给任务调度器(TaskScheduler
),然后反馈给DAG调度器(DAGScheduler
),运行完毕后写入数据并释放所有资源。
具体的运行流程图如下所示,结合两幅图进行学习:
总体而言,Spark运行架构具有以下特点:
- 1、每个
Application
都有自己专属的Executor
进程,并且该进程在Application
运行期间一直驻留。Executor
进程以多线程的方式运行Task
- 2、Spark运行过程与资源管理器无关,只要能够获取
Executor
进程并保持通信即可 - 3、Task采用了数据本地性和推测执行等优化机制