目录
一、介绍yarn的模型图
运行流程
1、 用户向 YARN 中提交应用程序,其中包括 MRAppMaster 程序,启动 MRAppMaster 的命令,用户程序等。
2、ResourceManager 为该程序分配第一个 Container,并与对应的 NodeManager 通讯,要求它在这个 Container 中启动应用程序 MRAppMaster。
3、MRAppMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManager查看应用程序的运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结束,重复 4 到 7 的步骤。
4、MRAppMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
5、一旦 MRAppMaster 申请到资源后,便与对应的 NodeManager 通讯,要求它启动任务。
6、NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
7、各个任务通过某个 RPC 协议向 MRAppMaster 汇报自己的状态和进度,以让 MRAppMaster随时掌握各个任务的运行状态,从而可以在任务败的时候重新启动任务。
8、应用程序运行完成后,MRAppMaster 向 ResourceManager 注销并关闭自己。
二、AppMaster和Driver
上面了解了appmaster在yarn运行流程中的角色,再区分下AppMaster和Driver,任何一个yarn上运行的任务都必须有一个AppMaster,而任何一个Spark任务都会有一个Driver,Driver就是运行SparkContext(它会构建TaskScheduler和DAGScheduler)的进程,当然在Driver上你也可以做很多非Spark的事情,这些事情只会在Driver上面执行,而由SparkContext上牵引出来的代码则会由DAGScheduler分析,并形成Job和Stage交由TaskScheduler,再由TaskScheduler交由各Executor分布式执行。
所以Driver和AppMaster是两个完全不同的东西,Driver是控制Spark计算和任务资源的,而AppMaster是控制yarn app运行和任务资源的,只不过在Spark on Yarn上,这两者就出现了交叉,而在standalone模式下,资源则由Driver管理。在Spark on Yarn上,Driver会和AppMaster通信,资源的申请由AppMaster来完成,而任务的调度和执行则由Driver完成,Driver会通过与AppMaster通信来让Executor的执行具体的任务。
三、YARN-Cluster和YARN-Client的区别
3.1YARN-client的⼯作流程
执⾏过程:
- 1. Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择 YarnClientClusterScheduler和YarnClientSchedulerBackend
- 2. ResourceManager收到请求后,在集群中选择⼀个NodeManager,为该应⽤程序分配第⼀个 Container,要求它在这个Container中启动应⽤程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运⾏SparkContext,只与SparkContext进⾏联系进⾏资源的分派
- 3. Client中的SparkContext初始化完毕后,与ApplicationMaster建⽴通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container)
- 4. ⼀旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task
- 5. client中的SparkContext分配Task给CoarseGrainedExecutorBackend执⾏,CoarseGrainedExecutorBackend运⾏Task并向Driver汇报运⾏的状态和进度,以让Client随时掌握各个任务的运⾏状态,从⽽可以在任务失败时重新启动任务
- 6. 应⽤程序运⾏完成后,Client的SparkContext向ResourceManager申请注销并关闭⾃⼰
注意:因为是与Client端通信,所以Client不能关闭。
YARN-Client的执行
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn --deploy-mode client \
--num-executors 1 \
/Users/ly/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10
3.2YARN-Cluster的工作原理
执⾏过程:
- 1. Spark Yarn Client向YARN中提交应⽤程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运⾏的程序等
- 2. ResourceManager收到请求后,在集群中选择⼀个NodeManager,为该应⽤程序分配第⼀个Container,要求它在这个Container中启动应⽤程序的ApplicationMaster,其中ApplicationMaster进⾏SparkContext等的初始化
- 3. ApplicationMaster向ResourceManager注册,这样⽤户可以直接通过ResourceManage查看应⽤程序的运⾏状态,然后它将采⽤轮询的⽅式通过RPC协议为各个任务申请资源,并监控它们的运⾏状态直到运⾏结束
- 4. ⼀旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,⽽Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的CoarseGrainedExecutorBackend启动后会向 ApplicationMaster中的SparkContext注册并申请Task。这⼀点和Standalone模式⼀样,只不过 SparkContext在Spark Application中初始化时,使⽤CoarseGrainedSchedulerBackend配合 YarnClusterScheduler进⾏任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的⼀个 简单包装,增加了对Executor的等待逻辑等
- 5. ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执⾏,CoarseGrainedExecutorBackend运⾏Task并向ApplicationMaster汇报运⾏的状态和进度,以让 ApplicationMaster随时掌握各个任务的运⾏状态,从⽽可以在任务失败时重新启动任务应⽤程序运⾏完成后,ApplicationMaster向ResourceManager申请注销并关闭⾃⼰
- 6.应⽤程序运⾏完成后,ApplicationMaster向ResourceManager申请注销并关闭⾃⼰
YARN-Cluster的执行
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn --deploy-mode cluster \
--num-executors 1 \
/Users/ly/apps/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar 10
注:Client提交申请后可关闭3.3Cluster和Client区别
-
YARN-Cluster 模式下, Driver 运⾏在 AM(Application Master) 中,它负责向 YARN 申请资源,并监督作业的运⾏状况。当⽤户提交了作业之后,就可以关掉Client ,作业会继续在 YARN 上运⾏,因⽽ YARN-Cluster 模式不 适合运⾏交互类型的作业
-
YARN-Client 模式下, Application Master 仅仅向 YARN 请求 Executor , Client 会和请求的 Container 通信来调度他们⼯作,也就是说Client 不能离开
( 1 ) YarnCluster 的 Driver 是在集群的某⼀台 NM 上,但是 Yarn-Client 就是在 RM 的机器上;( 2 )⽽ Driver 会和 Executors 进⾏通信,所以 Yarn_cluster 在提交 App 之后可以关闭 Client ,⽽ Yarn-Client不可以;( 3 ) Yarn-Cluster 适合⽣产环境, Yarn-Client 适合交互和调试。