了解了Yarn上的程序如何启动之后(详情《Yarn初步了解》),本文来分析一下Spark On Yarn程序的启动流程,具体来说是Client模式下Spark On Yarn程序是如何启动的。

Spark on Yarn是如何运行起来的:

    从SparkContext的启动开始看进去。SparkContext初始化内部具体细节可以看下本人之前写的《SparkContext初始化流程》这篇文章,这篇是基于StandAlone模式写的。最初的流程还是一样的,创建taskScheduler和schedulerBackend:

TaskScheduler:负责Task的调度,它所调度的Task是由DAGScheduler创建的

***schedulerBackend:负责连接Master并注册当前的程序;申请资源(Executor)和task具体到Executor的执行和管理,具体类型和deploy Mode有关比如standalone或者on yarn

yarn state 和finalstatus的区别 spark standalone和yarn区别_远程调试

 

只是现在创建的是可以与Yarn交互的类:

yarn state 和finalstatus的区别 spark standalone和yarn区别_初始化_02

 

并且createSchedulerBackend内部创建的是Yarn下的Client,而不是StandAloneAppClient(用于向Master注册任务,申请资源用的):

yarn state 和finalstatus的区别 spark standalone和yarn区别_初始化_03

Client类中核心是下面三个方法:

 

yarn state 和finalstatus的区别 spark standalone和yarn区别_初始化_04

检查资源是否足够,如果资源足够的情况下向ResourceManager申请资源启动AM,再由AM向ResourceManager申请资源用于启动Executor,AM连接具体的NodeManager启动Executor。

    AM类可能是org.apache.spark.deploy.yarn.ApplicationMaster/ ExecutorLauncher,分别对应Cluster模式和Client模式。

 

Spark On Yarn Client VS Cluster:

Client模式一般用于测试,这种情况下Driver端是运行在本地的,好处是可以本地调试方便。Cluster一般用于生产环境,但是调试不方便,只能到Yarn上找log或者远程调试(AM是随机起在任意一台NodeManager中的,远程调试还得先找一找)。

在Yarn中,每个Application实例都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责和ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。

Cluster模式下,Driver运行在AM(Application Master)中,它负责向Yarn申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在Yarn上运行,因而Cluster模式不适合运行交互类型的作业;

Client模式下,Application Master仅仅向Yarn请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开;

 

个人觉得,都是Client模式运行,StandAlone和Yarn的区别在于,Yarn多了一个ApplicationMaster。