本文描述Spark on yarn的job提交流程
1. 相关知识
Spark支持可插拔的集群管理模式(Standalone、Mesos以及YARN ),
集群管理负责启动executor进程,编写Spark application 的人根本不需要知道Spark用的是什么集群管理。
Spark支持的三种集群模式,这三种集群模式都由两个组件组成:master和slave。
-
Master服务(YARN ResourceManager,Mesos master和Spark standalone master)决定哪些application可以运行,什么时候运行以及哪里去运行。
-
slave服务( YARN NodeManager, Mesos slave和Spark standalone slave)实际上运行executor进程。
Spark on yarn有分为两种模式yarn-cluster和yarn-client. 每个Spark executor作为一个YARN容器(container)运行。
Spark可以使得多个Tasks在同一个容器(container)里面运行。注意这里和Hadoop的MapReduce作业不一样,MapReduce作业为每个Task开启不同的JVM来运行
yarn-cluster适用于生产环境;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出。
2. job提交
2.1. client模式
在YARN Client模式下,Driver在任务提交的本地服务器上运行,流程如下:
-
Driver启动时,实例化SparkContext,和ResourceManager通讯,申请启动ApplicationMaster
-
ResourceManager根据资源情况,分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存。
-
AppMaster向RM注册应用程序并申请资源。ResourceManager监控AppMaster的状态直到AppMaster结束。
-
AppMaster申请到资源后,与NodeManager通信在Container中启动Executor进程
-
Executor向driver反向注册,申请任务
-
Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。
-
Executor中执行Task,并将执行结果或状态汇报给Driver
-
应用执行完毕,AppMaster通知RM注销应用,回收资源
2.2. cluster模式
在YARN Cluster模式下,Driver与exector都在YARN上运行,流程如下:
-
spark submit提交后,启动应用程序实例化SparkContext,和ResourceManager通讯申请启动ApplicationMaster,
-
ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver。RM监控AppMaster的状态直到AppMaster结束
-
AppMaster向RM注册应用程序并申请资源
-
AppMaster申请到资源后,与NM通信在Container中启动Executor进程
-
Executor进程启动后会向Driver反向注册,并申请任务
-
Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。
-
Executor中执行Task,并将执行结果或状态汇报给Driver
-
应用执行完毕,AppMaster通知RM注销应用,回收资源
2.3. client与cluster模式的区别
- client模式,driver运行在本地机器上;cluster模式,driver运行在yarn集群上某一个nodeManager节点上
- client模式会导致本地机器负责spark任务的调度,导致网卡流量会激增,且出了故障后无法转移;cluster模式没有网络流量激增的问题
- client的driver运行在本地,通常来说本地机器与yarn集群不在同一个机房,所以说性能不会好; cluster模式下,driver与executor都运行在yarn集群的nodeManager上,网络流量都在yarn集群内,在同一个网络和机房【绝大多数情况下】,性能上来说会更好。