一、Yarn Client的工作流程图
-
Spark Yarn Client向Yarn的ResourceManager申请启动ApplicationMaster。同时在SparkContext初始化将DAGSecheduler和TaskScheduler等组件,由于我们选择yarn-client模式,程序回选择YarnClientClustserSchelder和YarnClientSchedulerBackend。
-
ResourceManager收到请求之后,在集群中选择某一个NodeManager作为该应用程序分配第一个Contaier,要求在这个Container启动一个ApplicationMaster。与Yarn-cluser模式区别是在ApplicationMaster中不运行SparkContext,只与SparkContext进行联系进行资源分配。
-
Client中的SparkContext在初始化完毕之后,与ApplicationMaster只建立通讯。向ResurceManager注册,根据任务信息向ResourceManager申请资源。
-
一旦在ApplicationMaster中申请到了资源,便与对应NodeManager通信,要求它在活得的Container中启动CoarseGrainedExecutorBackend,这个组件在启动后向Client中的SparkContext注册并申请Task。
-
client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行并且向Driver汇报运行的状态和进度。
-
当整个应用程序完成之后,client的SparkContext向ResourceManager申请注销并关闭自己
二、Yarn Cluster工作流程图
小结:cluster和client模式的区别
首先你要清楚一个概念:ApplicationMaster。在Yarn总,每个Application实例(Flink Application、Spark Application、Mapreduce Application...)都有ApplicationMaster进程,它是Application启动的时候产生的第一个容器。它负责和ResaurceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次将yarn-cluser和yarn-client模式的区别其实就是ApplicationMaster进程的区别。
Yarn-cluster模式下,Driver运行在ApplicationMaster中,它负责向Yarn申请资源,并监督job运行状况。用户提交job之后,client就可以关掉了,但是job会继续在yarn上运行。
yarn-client模式,ApplicationMaster仅仅向yarn请求executor,client会和请求的container通信来调度他们的工作,所以说client会不会关掉?答案肯定是不能。
得出一个结论:
- driver会和executor进行通信,所以yarn-cluster在提交app之后可以关闭client,但是yarn-client不可以
- yarn-cluster适合生产环境中使用,yarn-client适合在测试的交互环境中使用