Spark yarn-client和yarn-cluster的区别

  之前面试遇到过一次这个问题,回答的很不好,这次专门记录下来,进行深入的解析两者区别。
  首先,最简单也十分浅显的一种说法是:

  • yarn-cluster是用于生产环境,这种模式下客户端client在提交了任务以后,任务就托管给yarn了,这个时候client就可以断开连接不需要再管后续事情了,这种情况下无法直接查看到application运行的日志,查看日志较为麻烦;
  • 而yarn-client则是主要用于测试时使用,这种模式下客户端client提交任务后,不能直接断开连接,客户端可以看到application运行的实时日志,非常方便开发调试。

  大部分人估计都会进行如上回复,但是后来某一天看到一个技术群里有人在讨论yarn-client模式的作用,有人觉得这个模式除了调试没啥卵用。但是,有人就提出了异议,说明了yarn-client模式在实际生产中也有应用场景,我们先直接把应用场景说出来就是:应用于Driver需要和第三方系统进行交互的场景,就是说application运行过程中会和第三方其它系统产生交互。这种场景下就需要固定Driver,而yarn-cluster模式则无法满足固定Driver在某台机器上。
  以上是针对两种模式应用场景的区别进行的介绍,那么实际上,这两个模式内部架构的区别我们可以来进一步介绍,从而和上面的应用场景进行相互印证,深入了解内部机制,知道以后什么场景下该如何选择不同的运行模式。
  在介绍两者架构区别前,先来了解一下ApplicationMaster这个进程的概念。我们在执行Spark on Yarn时,每个提交的Spark应用都会对应有一个Application Master进程,这个进程的作用基本通过进程名已经能够猜出大半,就是类似于application应用对外的发言人,具体来说就是应用需要什么资源等工作,都是它来负责和yarn的RM进行沟通来申请资源的,RM会告诉Application Master有哪些节点上是有资源可以使用的,然后application Master知道后会和NodeManager沟通,让NodeManager启动对应的Container来提供服务。
  了解了以上内容以后,我们可以知道ApplicationMaster是十分重要的,那么继续来看yarn-clientyarn-cluster模式的实际运行区别,先直接上图:
Spark yarn-client和yarn-cluster的区别
Spark yarn-client和yarn-cluster的区别

  以上两幅图应该是能够很好的解释yarn-clientyarn-cluster模式的区别了,可以看到对于yarn-cluster而言,任务提交后其实之后的ApplicationMaster进程的启动是全权交付给yarn集群来管理,在yarn集群中那么ApplicationMaster具体会运行在哪台机器上是完全随机的,而且此时Driver是作为一个线程在ApplicationMaster中运行的;而对于yarn-client来说,它在提交任务后,Driver是运行在本地client端的,所以是可以知道Driver的ip地址的,这种情况之下,Driver是可以运行在Yarn集群之外的,可以很方便的和外部第三方应用进行交互。
  以上就是yarn-clientyarn-cluster两者之间的区别~