Spark_Flink_Hadoop大数据

【Spark原理】Spark内部原理学习笔记

2017-05-17  本文已影响216人  和心数据

1 总体框架结构图

Spark应用程序架构

由上图我们可以看到Spark应用程序架构主要由Driver Program和Executor构成,Driver负责运行main()和创建SparkContext,Executor主要负责执行Task任务。

2 各大重要组件和概念

2.1 重要概念

|概念|功能|模型|备注|
|:---|:---|:---:|
|Application|用户定义的Spark应用程序,用户提交后,Spark会为应用分配资源,调度和执行相关任务||.|
|RDD Graph|Spark会分析Spark应用,将程序中所涉及的RDD按照一定的依赖关系构建RDD Graph,也就是根据算子来构建有向无环图,每个RDD Graph都会转化成一个Job|||
|Job|- 一个App中可以包含多个Job,每个Job都是由一个RDD Graph转化而来的
- 由Action算子触发||.|
|Stage|- 每个Job会根据RDD之间的宽依赖(Shuffle Dependency)来划分成多个Stage,每一个Stage中包含一组Task(也就是TaskSet)
- 每个Stage中的Task类型都是相同的||.|
|Task|- 一个分区对应一个Task
- Task执行RDD中对应的算子,Task被封装TaskRunner后放入Executor的线程中来执行,并由TaskRunner来进行调度
- Task类型有ShuffleMapTask和ResultTask||.|
|Worker|可以运行App代码的节点,如Yarn中NodeManager||.|
|DAGScheduler|用来构建基于Stage的有向无环图,划分的依据是根据RDD之间的宽依赖||.|
|TaskScheduler|- 将TaskSet提交给Executor去运行
- 维护TaskSet的运行状态标签,负责Task的失效重执行||.|

2.2 相关组件

|组件 |功能 |模型|备注|
|:----||||
|Driver|- 运行Application的main函数并创建SparkContext
- SparkContext的作用就是与Cluster Manager通讯,进行资源申请、任务的调度等。||.|
|Executor|- 某个App运行在Worker上的一个进程,用于执行App的Task
- 每个App都有独立的Executor,Executor上运行的Task取决于分配的core数
||.|
|Cluster Manager|资源调度服务,用于资源的分配和调度,有standalone、mesos和yarn三种模式||.|

3 应用的提交执行流程

3.1 运行模式

1)Spark应用的运行模式有以下几种:

2)根据Driver的运行位置来划分有以下两种运行模式:

3)命令行

3.2 流程

这里我们就以 Spark On Yarn 为例来说明

3.2.1 Yarn-Client 模式

流程如下:

  1. 在客户端通过spark-submit向Yarn提交Application
  2. 应用在Client启动Driver,创建SparkContext并进行初始化
  3. ResourceManger为应用申请一个Container来启动Application Master,用来与Client中的SparkContext进行通讯。
  4. Application Master即承担起了为应用申请资源运行Executor的责任,一旦申请到资源,那么就会在指定的NodeManager的Container上创建Executor进程,Executor会向SparkContext注册,保持通讯
  5. SparkContext会根据任务所需资源,数据本地性等条件指定Task的运行在哪个Executor上,将Task分发到指定Executor并开始执行,Executor会周期向SparkContext汇报任务运行情况
  6. 一旦所有任务执行完毕,SparkContext会向ResourceManger申请注销自己并关闭

3.2.2 Yarn-Cluster 模式

流程如下:

  1. 在客户端通过spark-submit向Yarn提交Application
  2. ResourceManger为应用申请一个Container来启动Application Master,并且在Application Master进行SparkContext等初始化。
  3. Application Master即承担起了为应用申请资源运行Executor的责任,一旦申请到资源,那么就会在指定的NodeManager的Container上创建Executor进程,Executor会向SparkContext注册,保持通讯
  4. Applicaiton Master会根据任务所需资源,数据本地性等条件指定Task的运行在哪个Executor上,将Task分发到指定Executor并开始执行,Executor会周期向Applicaiton Master汇报任务运行情况
  5. 一旦所有任务执行完毕,Applicaiton Master会向ResourceManger申请注销自己并关闭

3.3 Job的全生命周期

4 Spark的读写流程

4.1 写入流程

  1. RDD调用compute( )方法进行指定分区的写入。
  2. CacheManager中调用BlockManater判断数据是否已经写入,如果未写则写入。
  3. BlockManager中数据与其他节点同步。(与副本节点通讯)
  4. BlockManager根据存储级别写入指定的存储层。(存储级别决定了数据是存储在内存还是磁盘,或者是两者结合)
  5. BlockManager向主节点汇报存储状态。

4.2 读取流程

  1. RDD调用compute( )方法进行指定分区的读取。
  2. 调用BlockManager的get()进行读取

5 Spark各组件之间的通信方式和流程

5.1 通讯框架

1.6之前

1.6 后

5.2 通讯的简单流程

6 Spark的容错机制

分布式系统常用的容错机制

Spark所采用的容错机制是记录数据更新和数据检查点相结合的形式。原因如下:

以下情况需要添加检查点

在RDD计算中,通过检查点机制进行容错,传统做检查点有两种方式:通过冗余数据和日志记录更新操作。RDD中所采用的就是通过冗余数据来缓存数据,然后对已进行冗余
操作的RDD执行删除该祖先的RDD依赖

官方建议,做检查点的RDD做好先缓存在内存中,否则需要进行重新计算

7 Spark的Shuffle机制

Shuffle中文意思就是混洗,跟MapReduce中的Shuffle的思想是相同,就是数据的重新分区和组合

Spark的Shuffle是在stage的承接阶段完成的,前面的stage会根据后面stage的分区数来将数据按照一定的规则分成相应的bucket,然后写到磁盘上。后续的stage会从元数据那里获得指定数据的所在节点,将数据拉取本地做进一步的操作

Shuffle分为两个阶段

Shuffle Aggregator并不会对所有情况下的数据进行排序,所以Aggregator分为不需要外排和需要外排两种方式

在Reduce端,各个Task会并发启动多个线程同时从多个Map Task端拉取数据。由于Reduce阶段的主要任务是对数据进行按组规约。也就是说,需要将数据分成若干组,以便以组为单位进行处理。大家知道,分组的方式非常多,常见的有:Map/HashTable(key相同的,放到同一个value list中)和Sort(按key进行排序,key相同的一组,经排序后会挨在一起),这两种方式各有优缺点,第一种复杂度低,效率高,但是需要将数据全部放到内存中,第二种方案复杂度高,但能够借助磁盘(外部排序)处理庞大的数据集。Spark前期采用了第一种方案,而在最新的版本中加入了第二种方案, MapReduce则从一开始就选用了基于sort的方案。
摘抄自董西成的文章链接如下http://dongxicheng.org/framework-on-yarn/apache-spark-shuffle-details/

上一篇 下一篇

猜你喜欢

热点阅读