Spark架构和原理

介绍

Spark是一个开源分布式计算框架,可以进行批处理和流处理计算。相对于其他分布式计算框架,它有几个特点:
1、快。Spark是基于内存进行计算的,官方宣称计算速度比MapReduce快100倍
2、易用。提供了Java、Python、Scala、R等多种语言支持,也支持SQL交互方式
3、全面。Spark包含了多种计算库,有Spark SQL、Spark Streaming、MLlib、GraphX
4、可移植。Spark可以运行在多种平台上,包括Hadoop、Apache Mesos、Kubernetes、Standalone、Cloud

Spark生态圈

Spark内部包含了多种计算库,用于支撑不同的数据计算。Spark生态圈包括:
1、Spark Core。Spark核心部分,包含基本功能(任务调度、内存管理、容错机制)和RDD相关操作API,其他Spark库都是构建在Spark Core和RDD之上的
2、Spark SQL。处理结构化数据的计算库,提供SQL语言级别的使用
3、Spark Streaming。准实时流式计算库
4、MLlib。机器学习库
5、GraphX。图计算库

以下是Spark生态圈官方图谱:
Spark架构和原理_第1张图片

Spark RDD

RDD(Resilient Distributed Dataset)弹性式分布数据集,是Spark内部计算专用的数据结构。在Spark计算时候,先将外部数据源转化成RDD,然后基于RDD再进行转化或者分析计算。
RDD特点:
1、只读性。RDD具有只读性,不能进行更新等操作,RDD只能进行转换,由原来的RDD转换成另外一个新RDD
2、分区性。RDD具有分区特性,一个RDD的数据可能存储在多个节点上
3、弹性。虽然RDD是只读的,但是可以进行转换和计算操作,比如Transformation、Action、Repartition
4、持久化。RDD可调用persist()、cache()方法将数据持久化到内存中
5、可存储任何形式数据。例如存储Java对象时,可避免序列化和反序列化开销

提示:DAG图中Stage是根据RDD之间依赖关系进行划分的,依赖关系分为宽依赖(Shuffle/Wide Dependency)和窄依赖(Narrow Dependency),通常宽依赖做为Stage划分的标志。

以下是一个简单程序处理逻辑:
Spark架构和原理_第2张图片
1、读取数据源转化为RDD。textFile = sc.textFile(“SomeFile.txt”)
2、Transformation转换。linesWithSpark = textFile.filter(lambda line: “Spark” in line)
3、Action计算。linesWithSpark.count()、linesWithSpark.first()

运行架构

用户编写Application代码,然后提交给Spark执行,Spark运行计算时主要有四大组件:
1、Master。负责监控和管理整个集群资源,有Standalone、YARN、Mesos模式进行资源管理
2、Worker。工作节点,接收Master分配的任务,启动Executor或Driver
3、Executor。Worker节点的一个进程,负责执行Task
4、Driver。Applicaton的main()函数运行的地方,根据集群运行模式Driver可运行在Master或者Worker上
Spark架构和原理_第3张图片

程序运行流程

Spark将用户提交的Application程序构建成DAG,然后按照DAG划分任务,将任务分配给各个Worker执行,当整个Application计算完成后销毁相应实例并释放资源。
运行中名词解释:

1、Application:用户编写的Spark程序
2、Driver:运行Application的main函数地方。创建SparkContext准备应用程序运行环境,SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭
3、Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task
4、RDD:弹性分布式数据集,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
5、Task:运行在Executor上的工作单元,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
6、Job:包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Action计算会产生一个Job
7、Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,Stage的划分和调度是有DAGScheduler来负责的,两个Stage边界就是发生Shuffle的地方
8、DAGScheduler: 根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法
9、TASKSedulter: 将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task

以下是运行流程图:
Spark架构和原理_第4张图片
上图表示在Spark执行用户提交的Application时整个任务执行的过程:
1、接收到运行用户提交的Application命令后,先像资源管理器申请启动Driver。启动Driver后,实例化SparkContext用于进行资源申请、任务分配和监控
2、SparkContext向资源管理器(Standalone、YARN、Mesos)申请运行需要的Executor资源,然后启动Executor
3、SparkContext根据RDD依赖关系构建DAG图,然后将DAG图提交给DAGScheduler解析成多个Stage,将Stage以TaskSet形式提交给TaskScheduler。Executor根据自身使用情况向SparkContext申请Task任务,TaskScheduler将Task发放给Executor执行
4、在执行期间各个Executor向Driver以心跳形式汇报执行进度和资源使用情况,Task把执行结果反馈给TaskScheduler,TaskScheduler将信息发送给

Standalone VS YARN

Standalone运行模式和YARN运行模式中,区别在于资源管理器拥有者。Standalone模式中,Master充当资源管理器角色。YARN模式中,资源管理统一交给YARN,运行应用程序时资源由YARN进行调度管理。
用户通常使用spark-submit脚本提交应用程序,提交方式分为client和cluster两种。以client方式提交应用程序时,Driver运行在client端,在整个应用程序执行完毕前,不能关闭client。cluster方式提交应用程序时,Driver运行在Worker节点,与client无关,当把应用程序提交给Spark后,client就可以关闭了。
Standalone集群模式下,以client方式提交应用程序,执行流程:
Spark架构和原理_第5张图片
由此可见,在Standalone模式下,程序运行时:
1、Driver运行在client端,因此SparkContext也运行在client端
2、Master管理整个集群资源,client向Master申请资源使用或注销
3、client与Worker保持心跳联系,随时监控各个Executor资源使用情况和Task运行进度。因此client在应用程序执行完成前不能关闭
YARN运行模式下,用户以cluster提交应用程序,运行流程:
Spark架构和原理_第6张图片
与Standalone模式下client方式提交不同,在YARN模式下,以cluster形式提交应用程序时:
1、集群资源由YARN管理,程序运行时资源申请和注销都必须向YARN申请
2、不同于client提交方式,cluster提交应用程序时,Driver运行在集群中,与client无关

水平一般,能力有限,大数据小学生一枚。文章主要用于个人学习和总结,如果能给他人带来帮助,纯属意外。

你可能感兴趣的:(Spark)