Spark基础学习笔记03:Spark运行架构及原理

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark基础学习笔记03:Spark运行架构及原理相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 了解Spark架构
  2. 了解Spark原理

一、Spark架构

(一)采用主从模型

  • Spark架构采用了分布式计算中的Master-Slave模型
  • Master是对应集群中的含有Master进程的节点
  • Slave是集群中含有Worker进程的节点
  • Master作为整个集群的控制器,负责整个集群的正常运行
  • Worker相当于是计算节点,接收主节点命令与进行状态汇报
  • Executor负责任务的执行
  • Client作为用户的客户端负责提交应用
  • Driver负责控制一个应用的执行

(二)整体流程

  • Spark的Driver负责接收读取用户的数据,完成task的解析和生成,并向Cluster Manager(集群资源管理器)申请运行Task需要的资源。集群资源管理器为Task分配满足要求的节点,并在节点创建Executor。创建的Executor向Driver注册。Driver将Spark应用程序的代码和数据传送给分配的Executor。Executor运行task,运行完之后将结果返回给Driver或者写入HDFS或者其他介质。

二、Spark执行过程

(一)Spark on Standalone 模式

  1. SparkContext连接到Master,向Master注冊并申请资源(CPU Core 和Memory)。

  2. Master依据SparkContext的资源申请要求和worker心跳周期内报告的信息决定在哪个worker上分配资源。然后在该worker上获取资源,然后启动standaloneExecutorBackend。

  3. StandaloneExecutorBackend向SparkContext注册。

  4. SparkContext将Applicaiton代码发StandaloneExecutorBackend;而且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage(当碰到Action操作时,就会催生Job。每个Job中含有1个或多个Stage,Stage一般在获取外部数据和shuffle之前产生);然后以Stage(或者称为TaskSet)提交给Task Scheduler,Task Scheduler负责将Task分配到对应的worker,最后提交给StandaloneExecutorBackend执行。

  5. StandaloneExecutorBackend会建立executor 线程池。开始始执行Task,并向SparkContext报告。直至Task完毕。

  6. 全部Task完毕后。SparkContext向Master注销。释放资源。

(二)Spark on YARN 模式

  • Spark on YARN模式根据Driver在集群中的位置分为两种模式,一种是YARN-Client模式(客户端模式),另一种是YARN-Cluster模式(集群模式)。

1、YARN-Cluster 运行流程

2、YARN-Client 运行流程

3、两种模式的比较

  • 在YARN-Cluster模式下,Spark Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户 提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,所以YARN-Cluster模式不适合运行交互类型的作业。然而在YARN-Client模式下,AM仅仅向YARN请求Executor,Client会和请求得到的Container通信来调度它们工作,也就是说Client不能离开。
  • 总结起来就是集群模式的Spark Driver运行在AM中,而客户端模式的Spark Driver运行在客户端。所以,YARN-Cluster适用于生产环境,而YARN-Client适用于交互和调试,也就是希望快速地看到应用的输出信息。

三、初步了解RDD

(一)RDD概念

  • RDD(Resilient Distributed Datasets弹性分布式数据集),是Spark中最重要的概念,可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)。

(二)RDD特点

  • 它是集群节点上的不可改变的、已分区的集合对象
  • 通过并行转换的方式来创建如(map、filter、join等)
  • 失败自动重建
  • 可以控制存储级别(内存、磁盘等)来进行重用
  • 必须是可序列化的
  • RDD只能从持久存储或通过Transformations操作产生,相比于分布式共享内存(DSM)可以更高效实现容错,对于丢失部分数据分区只需要根据它的lineage就可重新计算出来,而不需要做特定的checkpoint
  • RDD的数据分区特性,可以通过数据的本地性来提高性能,这与Hadoop MapReduce是一样的
  • RDD都是可序列化的,在内存不足时可自动降级为磁盘存储,把RDD存储于磁盘上,这时性能有大的下降但不会差于现在的MapReduce

(三)RDD操作

  • 转换和动作两种类型

(四)RDD原理

  • (Resilient Distributed Dataset) 弹性分布式数据集,又称RDD,是Spark中数据的基本抽象,它是spark的核心。最早的RDD的设计思想可以参考论文:可伸缩性分布式数据集(Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing)。它代表一个可以并行操作的,不可修改的,分区元素的集合。

  • 一个RDD是一个弹性的分布式记录集,它分布在一个或多个分区上。(可以把RDD和Scala的Collections 进行类比,不过Scala的Collections是在单个JVM上,而RDD是分布在多个机器的执行节点上。)

  • Spark的RDD隐藏数据分区和数据分布,因此可以使用高级语言设计并行的计算框架。

四、窄依赖和宽依赖

(一)窄依赖

指父RDD的每一个分区最多被一个子RDD的分区所用,表现为一个父RDD的分区对应于一个子RDD的分区,和两个父RDD的分区对应于一个子RDD 的分区。图中,map/filter和union属于第一类,对输入进行协同划分(co-partitioned)的join属于第二类。

(二)宽依赖

  • 指子RDD的分区依赖于父RDD的所有分区,这是因为shuffle类操作,如图中的groupByKey和未经协同划分的join。

五、Stage

(一)Stage概念

  • 一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println),这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。如果job中有多次shuffle,那么每个shuffle之前都是一个stage。
  • 会根据RDD之间的依赖关系将DAG图划分为不同的阶段,对于窄依赖,由于partition依赖关系的确定性,partition的转换处理就可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中。

(二)Stage划分思路

  • Spark划分stage的整体思路:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。因此在上图中RDD C,RDD D,RDD E,RDD F被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。
  • 在spark中,Task的类型分为2种:ShuffleMapTask和ResultTask;简单来说,DAG的最后一个阶段会为每个结果的partition生成一个ResultTask,即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的!而其余所有阶段都会生成ShuffleMapTask;之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中;也就是说上图中的stage1和stage2相当于mapreduce中的Mapper,而ResultTask所代表的stage3就相当于mapreduce中的reducer。

六、Spark核心原理


以上是关于Spark基础学习笔记03:Spark运行架构及原理的主要内容,如果未能解决你的问题,请参考以下文章

Spark学习笔记5:Spark集群架构

Spark基础学习笔记06:搭建Spark On YARN模式的集群

学习笔记Spark—— Spark架构及原理

Spark基础学习笔记07:搭建Spark HA集群

Spark基础学习笔记01:初步了解Spark

Spark基础学习笔记04:Scala简介与安装