在Spark的yarn-client运行模式下,程序在提交之后会先后创建三个进程,分别为:SparkSubmit,ExecutorLauncher和CoarseGrainedExecutorBackend。下面以图解的方式分析其具体的执行流程:
下面是基于对源码的分析对上面的执行流程的具体解释:
需要注意的是:ExecutorLauncher进程和ApplicationMaster进程虽然进程的名字不一样,但是在本质上并没有什么区别,可以查看ExecutorLauncher的源码的注释:
/**
* This object does not provide any special functionality. It exists so that it's easy to tell
* apart the client-mode AM from the cluster-mode AM when using tools such as ps or jps.
*/
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}
}
目的:在Linux中使用ps或者jps指令的时候,能够区分出是Client运行模式下的AM或者是Cluster运行模式下的AM。
另外和yarn-cluster运行模式对比可以发现,两种模式的主要区别在于:
(1)Driver的运行位置不同:
在cluster模式下,Driver是ApplicationMaster中的一个子进程,运行在Hadoop集群中的某一个节点上;而在client模式下Driver是运行在提交程序的主机上。(需要注意的是,根据本人的实际开发经验,在生产环境中一般都是要使用cluster模式的,因为在client模式下,Driver会运行在个人或者公司的电脑上,而个人使用和公司办公使用的电脑的性能和服务器相比配置和性能都会差很多,而Executor会不断的和Driver进行通信,性能低下的电脑会影响程序的整体运行;另外服务器上的网络拓扑距离较短,更加利于进程彼此之间的通信)
(2)是否可以查看历史日志
在client模式下,可以发现日志全部打印在了本机的输出控制台中,而使用8088查看Executor执行的时候无法查看历史日志;在cluster模式下可以通过WebUI来查看运行的历史日志信息。