Spark核心源码分析2

大数据科学丛书
Spark核心源码分析与开发实战

在这里插入图片描述

第4章 Spark的运行模式

1.运行模式概览
standalone模式,即独立模式,通过它可以独立部署Spark集群,比如当我们只需要借助Spark进行大数据计算时,此模式是最佳模式。但当我们需要多种计算框架比如MR时,就需要引入外部资源管理系统YARN和Mesos对资源进行调度。Spark一开始就支持Mesos,yarn资源Container是不可动态伸缩的,一旦启动就不可变。
术语:
Application:用户构建的Spark应用程序,包括驱动程序和集群上运行的多个Executor代码
Driver:运行Application中的main()函数并创建SparkContext的进程,SparkContext负责与集群进行通信,进行资源的申请任务的分配和监控等。
Executor:在工作节点中为Spark应用所启动的进行,它可以运行task也可以在内存或磁盘中保存数据。
Worker:集群中任何可以运行Spark应用程序的节点slave配置的worker节点或者NodeManager节点。
Task:可以发给Executor执行的任务单元,是运行Spark应用的基本单元。
Job:包含多个Task的并行计算,一般由Spark的action触发产生,一个Application可能有多个Job。
Stage:每个Job会因为依赖关系拆分为多个task集合,命名为Stage
DAGScheduler:面向Stage的任务调度器,负责接收Spark应用程序提交的Job,根据RDD的依赖关系划分为Stage,并提交Stage给TaskScheduler
TaskScheduler:面向Task的任务调度器,接受DAGScheduler提交的TaskSets,然后把一个个的Task提交到Worker节点运行。
RDD:Spark的编程模型,它提供了丰富的操作算子,主要分为transformation和action算子。它表示已被分区,被序列化的,不可变的,有容错机制的,能够并行操作的数据集合。

2.Spark基本工作流程
(1)任何Spark的应用程序包含Driver和Executor,首先在Driver初始化SparkContext,是通往集群的唯一路径,SparkContext里包含DAGScheduler和TaskScheduler两个调度器类,创建的同时一起创建。
(2)SparkContext初始化完成后,首先根据Spark的相关设置向Cluster Manager申请所需资源,然后在worker节点初始化相应的Executor。Driver通过Spark中的RDD代码进行解析,生成相应的RDD图,描述了RDD相关信息及彼此之间的依赖关系。
(3)RDD图构建完毕后,Driver将提交给DAGSchduler进行解析。DAGScheduler在解析过程中遇见action算子后逆向解析,根据RDD之间的依赖关系是否存在shuffle等将RDD图解析为一系列具有先后依赖关系的Stage。如果两个RDD之间存在宽依赖关系则拆分为两个Stage执行,且只有前一个Stage执行完毕才会执行后一个Stage。
(4)DAGScheduler将划分的一系列Stage按照stage先后顺序依次提交给底层调度器TaskScheduler去执行
(5)TaskScheduler接受到Stage任务后,将会在集群环境中构建一个TaskSetManager实例来管理Stage的生命周期
(6)TaskSetManager将会把相关计算代码资源发送到对应的Executor上,并在Executor启动线程池执行。执行过程中会采用算法进行优化,提高计算效率,出现计算错误丢失也需要进行报告。
(7)在Task执行的过程中有部分程序涉及到IO操作,在每个Executor中由相应的BolckManager进行管理,相关信息将会在Driver中的Blocktracker进行交互和同步。
(8)在TaskThreads执行的过程中,如果存在运行错误、或其他影响问题导致的失败、将会默认重试3次,均失败后将上报TaskScheduler,或者再上报给DAGScheduler,根据各个Worker节点运行情况重新提交别的Executor执行。
(9)TaskThreads执行完毕后,将执行结果反馈给TaskScheduler,TaskScheduler再反馈给DAGScheduler,DAGScheduler将根据是否还存在待执行的Stage,循环提交给TaskScheduler执行。
(10)待所有Stage都执行完毕后,将会达到应用程序目的,或者输出到文件或者显示在屏幕。Driver本次运行过程结束,等待用户指令或结束。
(11)用户显式关闭SparkContext后,整个过程结束相关资源被释放。

3.Local模式
local最大的用处就是在单机上调试我们写的Spark应用程序。写法为local[N] N为线程数。
内部实现原理:1SparkContext对象创建的时候会在其内部调用自己的TaskScheduler()方法初始化TaskSchedulerImpl调度器,同时根据运行模式参数来匹配所需要选择的运行模式,然后生成LocalBackend的对象。并把backend当作参数传递给TaskSchedulerImpl的initialize方法。
2这时候TaskScheduler调用submitTasks方法提交任务的时候,它内部的backend是Loaclbackend对象,backend调用reviveoffers方法进行资源申请。
3在Localbackend调用reviveoffers方法后,会发送一个ReviveOffers消息给自己的内部类LocalActor接受并处理该消息。
4localActor通过自己的receiveWithLogging方法接收到ReviveOffers消息,并结合Scala语言消息匹配处理。
5localbanckend根据可以CPU核心数设定在生成资源返回给TaskSchedulerImpl使用,最后通过launchTask方法把Task发送到线程池运行。

4.Stand alone模式

5.YARN-Cluster模式
(1)Spark YARN Client 通过ApplicationClientProtocol协议向Yarn中的ResourceManager提交应用程序,其中包括ApplicationMaster程序,启动ApplicationMaster命令以及需要在Executor中运行的程序等。
(2)ResourceManager收到请求后与对应的Node Manager通信,为该应用程序分配第一个Container作为App Master。
(3)ResourceManager要求NodeManger在这个Container中启动启动应用程序的AppMaster,其中ApplicationMaster中包含SparkContext等的初始化。
(4)AppMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看程序运行状态。
(5)然后ApplicationMaster通过轮询方式通过RPC协议为各个任务申请资源,并监视他们的运行状态直到结束,其中Application的请求分配资源是通过YarnAllocationHandle来完成。
(6)一旦ApplicationMaster申请到资源,也就是Container后,通过ContainerManterProtocol协议与对应NodeManager通信,要求他在获得Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster注册并申请Task。
(7)ApplicationMaster的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并通过某个自定义RPC协议向ApplicationMaster报告自己的状态和任务进度,以让ApplicationMaster掌握各个任务状态,从而可以在失败时重新启动任务。
(8)应用程序运行完成后,ApplicationMaster向Resourcemanager申请注销并关闭自己。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值