1、先看看Yarn client的架构示意图
Yarn Client首先在Client端启动Driver,就是在Client端跑main函数了,这时候main函数所在的jar包还没提交给Yarn集群。SparkContext开始跑了,并且启动了YarnClientSchedulerBackend。然后YarnClientSchedulerBackend向Yarn提交申请执行ApplicationMaster(spark-yarn工程里的类),Yarn集群找到一台Container来执行ApplicationMaster,注意了:这里和yarn cluster的区别就是在Container上只启动ApplicationMaster,并不会启动Driver,因为已经启动过了。然后ApplicationMaster负责资源分配,调度Container来运行Executor,并且这些被调度启动的Executor是与Client端的Driver进行通信的。
2、再看看Yarn cluster的架构示意图
而Yarn cluster就简单的多了,Client端并不执行任何东西,将jar提交给Yarn集群,Yarn集群找到一台Container启动ApplicationMaster,这时候和yarn client的区别就来了,这时候ApplicationMaster会接着启动Driver,也就是说Driver和ApplicationMaster在同一个地方,然后ApplicationMaster进行调度启动的Executor也是同Driver通信,要注意的点就是这里的Driver和ApplicationMaster在同一个地方,运行在同一个进程内。
最后,Yarn client用于调试环境,而Yarn cluster用于生产环境。