Spark架构与工作机制
Spark架构与工作机制
Spark的架构 — 架构组件概念简介
Spark集群中Master负责集群整体资源管理和调度,Worker负责单个节点的资源管理。Driver程序是应用逻辑执行的起点,而多个Executor用来对数据进行并行处理。
Spark的构成:
- ClusterManager : 在standalone模式中即为,Master :主节点,控制整个集群,监控Worker。在YARN模式中为资源管理器。
- Worker : 从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。
- Driver : 运行Application的main()函数并且创建SparkContext。
- Executor: 执行器,是为某Application运行在worker node上的一个进程,启动线程池运行任务上。每个Application拥有独立的一组executors。
- SparkContext : 整个应用的上下文,控制应用的生命周期。
- RDD:Spark的基本计算单元,一组RDD形成执行的有向无环图RDD Graph。
- DAG Scheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler。
- TaskScheduler:将Task分发给Executor执行。
- SparkEnv : 线程级别的上下文,存储运行时的重要组件的引用。
Spark的架构 — 架构图
Spark的架构 — 集群执行机制
Client 提交应用,Master找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图提交给TaskScheduler,由TaskScheduler提交任务给Executor进行执行。任务执行的过程中其他组件再协同工作确保整个应用顺利执行。
Spark的工作机制
Spark作业:
- Application: 用户自定义的Spark程序,用户提交后,Spark为App分配资源将程序转换并执行。
- Driver Program :运行Application的main()函数并且创建SparkContext,。
- RDD Graph:RDD是Spark的核心结构,可以通过一系列算子进行操作(主要有Transformation和Action操作)。当RDD遇到Action算子,将之前的所有算子形成一个有向无环图(DAG),也就是图中的RDD Graph。再在Spark中转化为Job,提交到集群进行执行。一个App中可以包含多Job。
- Job: 一个RDD Graph触发的作业,往往由Spark Action算子触发,在SparkContext中通过runJob方法向Spark提交Job。
- Stage:每个Job会根据RDD的宽依赖关系被切分很多Stage,每个Stage中包含一组相同的Task,这一组Task也叫TaskSet。
- Task: 一个分区对应一个Task,Task执行RDD中对应Stage中所包含的算子。Task被封装好后放入Executor的线程池中执行。
Spark的工作机制 — 作业概念
Spark的工作机制 — 程序与作业概念映射
val rawFile = sc.textFile(“README.md”) // Application: 1–6 行
val words = rawFile.flatMap(line => line.split(“ ”)) // Job: 1-5 行
val wordNumber = words.map(w => (w, 1)) // Stage: 1–3 或 5-6 行
val wordCounts = wordNumber.reduceByKey(_ + _) // Tasks: 1-3 或 5–6行
wordCounts.foreach(println)
wordCounts.saveAsTextFile
Spark的工作机制 — 作业运行流程
Spark运行流程:
- Spark程序转换
- 输入数据块
- 根据调度策略执行各个Stage的Tasks
- 输出结果返回
Spark调度原理
Spark的调度原理 — 作业调度简介
系统的设计很重要的一环便是资源调度。设计者将资源进行不同粒度的抽象建模,然后将资源统一放入调度器,通过一定的算法进行调度,最终要达到高吞吐或者低访问延迟的目的。
Spark有多种运行模式,例如Local模式、Standalone模式、YARN模式、Mesos模式。在集群环境下,为了减少复杂性,抓住系统主要脉络进行理解。本节主要对Standalone模式中的名词进行介绍,其他运行模式中各角色实现的功能基本一致,只不过是在特定资源管理器下使用略为不同的名称和调度机制。
Spark的调度原理 — 作业调度简介
Spark的调度原理 — Application调度
Application调度就是组由用户提交到Spark中的作业集合,通过一定的算法,对每个按一定次序分配集群中资源的过程。
- 例如:
FIFO模式,用户先提交的作业1优先分配需要的资源,之后提交的作业2再分配资源,依次类推。
Application调度模式:
- Standalone :FIFO模式
- Mesos : 粗粒度模式和细粒度模式
- YARN : 独占模式
Spark的调度原理 — Job调度
Job调度就是在Application内部的一组Job集合,在Application分配到的资源量下,通过一定的算法,对每个按一定次序分配Application中资源的过程。
- 例如:
FIFO模式,用户先提交的Job1优先分配需要的资源,之后提交的Job2再分配资源,依次类推。
Job调度模式:
- FIFO模式
- FAIR模式
FIFO模式:
默认情况下,Spark的调度器以FIFO(先进先出)的方式调度Job的执行。每个Job被切分为多个stage。第一个Job优先获取所有可用的资源,接下来第二个Job再进行剩余资源获取。这样依次类推,如果第一个Job并没有占用满所有的资源,则第二个Job还可以继续获取剩余资源,这样多个Job可以并行运行。
FAIR模式:
在FAIR共享模式调度下,Spark在多Job之间以轮询(round robin)方式给任务进行资源分配,所有的任务拥有大致相当的优先级来共享集群的资源。这就意味着当一个长任务正在执行时,短任务仍可以被分配到资源,提交并执行,并且获得不错的响应时间。这样就不用像以前一样需要等待长任务执行完才可以。这种调度模式很适合多用户的场景。
数据本地性:
尽量的避免数据在网络上的传输。
Tasks延时调度机制:
拥有数据的节点当前正被其他的task占用,如果预测当前节点结束当前任务的时间要比移动数据的时间还要少,那么调度会等待,直到当前节点可用。否则移动数据到资源充足节点,分配任务执行。