YARN Cluster模式

1)执行脚本提交任务,实际是启动一个SparkSubmitJVM进程;

(2)SparkSubmit类中的main方法反射调用Client的main方法;

(3)Client创建Yarn客户端,然后向Yarn发送执行指令:bin/java ApplicationMaster;

(4)Yarn框架收到指令后会在指定的NM中启动ApplicationMaster;

(5)ApplicationMaster启动Driver线程,执行用户的作业;

(6)AM向RM注册,申请资源;

(7)获取资源后AM向NM发送指令:bin/java CoarseGrainedExecutorBacken;

(8)ExecutorBackend进程会接收消息,启动计算对象Executor并跟Driver通信,注册已经启动的Executor;

(9)Driver分配任务并监控任务的执行。

注意:SparkSubmitApplicationMasterCoarseGrainedExecutorBacken是独立的进程;ClientDriver是独立的线程;Executor是一个对象。

 Driver线程

 Driver线程主要是初始化SparkContext对象,准备运行所需的上下文,然后一方面保持与ApplicationMasterRPC连接,通过ApplicationMaster申请资源,另一方面根据用户业务逻辑开始调度任务,将任务下发到已有的空闲Executor上。

 

Driver初始化SparkContext过程中,会分别初始化DAGScheduler、TaskScheduler、SchedulerBackend以及HeartbeatReceiver,并启动SchedulerBackend以及HeartbeatReceiver。SchedulerBackend通过ApplicationMaster申请资源,并不断从TaskScheduler中拿到合适的Task分发到Executor执行。HeartbeatReceiver负责接收Executor的心跳信息,监控Executor的存活状况,并通知到TaskScheduler。

Executor进程

Executor进程起来后,会向Driver反向注册,注册成功后保持与Driver的心跳,同时等待Driver分发任务,当分发的任务执行完毕后,将任务状态上报给Driver

Spark Stage级调度之DAGScheduler

DAGScheduler负责Stage级的调度,主要是将job切分成若干Stages,并将每个Stage打包成TaskSet交给TaskScheduler调度。TaskScheduler负责Task级的调度,将DAGScheduler给过来的TaskSet按照指定的调度策略分发到Executor上执行,调度过程中SchedulerBackend负责提供可用资源,其中SchedulerBackend有多种实现,分别对接不同的资源管理系统。

SparkContext将Job交给DAGScheduler提交,它会根据RDD的血缘关系构成的DAG进行切分,将一个Job划分为若干Stages

具体划分策略是,

由最终的RDD不断通过依赖回溯判断父依赖是否是宽依赖,即以Shuffle为界,划分Stage,窄依赖的RDD之间被划分到同一个Stage中,可以进行pipeline式的计算。划分的Stages分两类,一类叫做ResultStage,为DAG最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据

Spark Task级调度之TaskScheduler

TaskScheduler会将TaskSet封装为TaskSetManager加入到调度队列中,按照指定的调度策略选择TaskSetManager去调度运行

TaskScheduler调度策略

TaskScheduler支持两种调度策略,一种是FIFO,也是默认的调度策略,另一种是FAIR

(1)FIFO调度策略

如果是采用FIFO调度策略,则直接简单地将TaskSetManager按照先来先到的方式入队,出队时直接拿出最先进队的TaskSetManager

(2)FAIR调度策略

FAIR模式中有一个rootPool和多个子Pool,各个子Pool中存储着所有待分配的TaskSetMagager。

FAIR模式中,需要先对子Pool进行排序,再对子Pool里面的TaskSetMagager进行排序,因为PoolTaskSetMagager都继承了Schedulable特质,因此使用相同的排序算法。

排序过程的比较是基于Fair-share来比较的,每个要排序的对象包含三个属性: runningTasks值(正在运行的Task数)、minShare(最小资源)值、weight(权重)值

本地化调度

从调度队列中拿到TaskSetManager后,那么接下来的工作就是TaskSetManager按照一定的规则一个个取出task给TaskScheduler,TaskScheduler再交给SchedulerBackend去发到Executor上执行

失败重试与黑名单机制

除了选择合适的Task调度运行外,还需要监控Task的执行状态,前面也提到,与外部打交道的是SchedulerBackend,Task被提交到Executor启动执行后,Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager,这样TaskSetManager就知道Task的失败与成功状态

 

SchedulerBackend

Task被提交到Executor启动执行后,Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager,这样TaskSetManager就知道Task的失败与成功状态

发布了355 篇原创文章 · 获赞 84 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_43193797/article/details/89509840