1、Spark on YARN:
Spark在YARN上运行时,有两种部署模式:集群模式(Cluster)和客户端模式(Client)。
2、不同运行模式中的任务调度器具体为:
Spark on Standalone模式:TaskScheduler
YARN-Client模式:YarnClientClusterScheduler
YARN-Cluster模式:YarnClusterScheduler
3、Spark on YARN-Client:
用户在进行交互运行时,必须运行在Client模式下。在YARN-Client模式中,Driver运行在客户端上,通过ApplicationMaster向ResourceManager获取资源。本地Driver负责与所有的Executor Container进行交互,并将最终的结果汇总。
YARN-Client工作流程步骤:
①Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContext初始化中创建DAGScheduler和TaskScheduler(YarnClientClusterScheduler)等;
②ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行通信进行资源的分派;
③Client中的SparkContext初始化完毕后,与ApplicationMaster建立通信,向ResourceManager注册,根据任务信息向ResourceManager申请资源;
④一旦ApplicationMaster申请到资源(Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task;
⑤client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task,并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
⑥应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭。
4、Spark on YARN-Cluster:
在YARN-Cluster模式中,当用户向YARN中提交应用程序后,YARN分两个阶段运行该应用程序:①把Spark的Driver作为一个ApplicationMaster在YARN集群中先启动;②由ApplicationMaster创建应用程序,然后为它向ResourceManager申请资源,并启动Executor来运行Task,同时监控它的整个运行过程,直到运行完成。
YARN-Cluster工作流程步骤:
①Spark Yarn Client向YARN的ResourceManager提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等;
②ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化;
③ApplicationMaster向ResourceManager注册,用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
④一旦ApplicationMaster申请到资源(Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,而Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等;
⑤ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task,并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
⑥应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭。
5、YARN-Client与YARN-Cluster的区别
在YARN中,每个应用程序(Application)都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责与ResourceManager进行通信并请求资源,获取资源后,为Container分配任务并对其进行监控。YARN-Client与YARN-Cluster的区别其实就是ApplicationMaster进程的区别。
- YARN-Client模式下,ApplicationMaster仅向YARN请求Executor,Client通过与Container通信来分配任务并进行监控,Client不能关闭;
- YARN-Cluster模式下,Driver运行在AM(ApplicationMaster)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关闭Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合交互式类型的作业。
YARN-Client | YARN-Cluster |
---|---|
Driver运行在RM中 | Driver运行在集群中的某一台NM上 |
Client和Executor进行通信,不可关闭Client | Driver和Executor进行通信,可关闭Client |
适合交互和调试 | 适合生产环境 |
6、Spark Standalone与Spark on YARN的对比
Spark Standalone | YARN-Client | YARN-Cluster | |
---|---|---|---|
Driver runs in | Client | Client | Application Master |
Who requests resources? | Client | Application Master | Application Master |
Who starts executor processes? | Spark Slave | YARN NodeManager | YARN NodeManager |
Persistent services | Spark Master and Workers | ResourceManager and NodeManagers | ResourceManager and NodeManagers |
Supports Spark Shell? | Yes | Yes | No |
7、Spark on YARN的资源分配配置(文件:spark-default.conf)
关于Application Master(AM)的配置
YARN-Client
属性 | 默认值 | 描述 |
---|---|---|
spark.yarn.am.memory | 512m | 在客户端模式下,用于YARN AM的内存量。 |
spark.yarn.am.cores | 1 | 在客户端模式下,用于YARN AM的内核数。 |
spark.yarn.am.memoryOverhead | AM memory * 0.10, with minimum of 384 | 在客户端模式下,为每个YARN AM分配的堆外内存量(单位:MB)。 |
YARN-Cluster
属性 | 默认值 | 描述 |
---|---|---|
spark.driver.memory | 1g | 用于Driver进程的内存量,即SparkContext初始化的内存量。注意:在客户端模式下,不能直接在应用程序中通过SparkConf设置此配置,因为驱动程序JVM已在此时启动。 |
spark.driver.cores | 1 | 在集群模式下,Driver进程的内核数。 |
spark.driver.memoryOverhead | driverMemory * 0.10, with minimum of 384 | 除非另有说明,否则在集群模式下,为每个Driver分配的堆外内存量(单位:MB)。 |
关于Executor的配置(yarn-client、yarn-cluster配置相同)
属性 | 默认值 | 描述 |
---|---|---|
spark.executor.instances | 2 | 静态分配的Executor数。使用spark.dynamicAllocation.enabled时,初始执行程序集至少含有该数量的executor数。 |
spark.executor.memory | 1g | 每个Executor进程使用的内存量。 |
spark.executor.cores | YARN模式下默认为1;Standalone和Mesos粗粒度模式下默认为工作节点上所有可用的内核。 | 每个Executor使用的内核数。 |
spark.executor.memoryOverhead | executorMemory * 0.10, with minimum of 384 | 除非另有说明,否则每个Executor要分配的堆外内存量(单位:MB)。 |