一、YARN简介
YARN是一个资源调度平台,是为了克服MR1局限性演化而来。
二、MR1的局限性
Hadoop1.0中主要由分布式存储系统HDFS和分布式计算框架MapReduce组成。
在这个版本中MapReduce由一个JobTracker和多个 TaskTracker 组成。从设计角度上看, Hadoop 1.0未能够将资源管理相关的功能与应用程序相关的功能分开 ,导致资源管理和应用程序管理混在一起,使得它在扩展性、 容错性和多框架支持等方面存在明显缺陷。
在MR1中,JobTracker 负责资源管理和所有作业的控制, 而 TaskTracker 负责接收来自JobTracker 的命令并执行它。
名词解释:
资源管理:与应用程序无关,只是分配资源:内存 cpu 磁盘等等(资源以container形式存在)
作业控制:直接与应用程序相关的模块, 且每个作业控制进程只负责管理一个作业
在Hadoop1.0中,NameNode存在单点故障问题,不能完成高可用。
三、YARN应用
在YARN集群中,拆分资源管理和任务调度,将原来的JobTracker分成两个独立的服务:
- 全局的资源管理器ResourceManager
- 每个程序特有的ApplicationMaster
YARN 专管资源管理和调度, 而 ApplicationMaster 则负责与具体应用程序相关的任务切分、任务调度和容错
YARN 总体上仍然是 Master/Slave 结构, 在整个资源管理框架中,ResourceManager 为Master, NodeManager 为 Slave, ResourceManager 负责对各个 NodeManager 上的资源进行统一管理和调度。 当用户提交一个应用程序时, 需要提供一个用以跟踪和管理这个程序的ApplicationMaster, 它负责向ResourceManager 申请资源, 并要求 NodeManger 启动可以占用一定资源的任务。 由于不同的 ApplicationMaster 被分布到不同的节点上, 因此它们之间不会相互影响
四、YARN组成
1. ResourceManager(RM)
RM 是一个全局的资源管理器, 负责整个系统的资源管理和分配。
两个组件构成:
- 调度器( Scheduler)
- 应用程序管理器( Applications Manager, ASM)
调度器根据容量、 队列等限制条件,将系统中的资源分配给各个正在运行的应用程序,不再从事任何与具体应用程序相关的工作。
应用程序管理器负责管理整个系统中所有应用程序, 包括应用程序提交、 与调度器协商资源以启动 ApplicationMaster、 监控 ApplicationMaster 运行状态并在失败时重新启动它
2. ApplicationMaster( AM)
- 与RM调度器协商以获取资源( 用 Container 表示)
- 将得到的任务进一步分配给内部的任务
- 与 NM 通信以启动 / 停止任务
- 监控所有任务运行状态, 并在任务运行失败时重新为任务申请资源以重启任务
3. NodeManager( NM)
NodeManager 是 YARN 集群当中真正资源的提供者,是真正执行应用程序的容器的提供者。
- 管理单个节点上的资源
- 处理来自 ResourceManager 的命令
- 处理来自 MRAppMaster 的命令
4. Container
Container 是 YARN 中的资源抽象, 它封装了某个节点上的多维度资源, 如内存、CPU、 磁盘、 网络等,YARN会为每个Task分配一个Container,容器大小是可以随程序要求动态调整的。
五、YARN工作流程
- 用户向YARN提交应用程序,包括AM程序,启动AM命令,用户程序等;
- RM为该应用程序分配一个container,并与对应的NM通信,要求它在这个container中启动应用程序AM;
- AM向RM注册,这样用户就可以通过RM监控运行程序运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结束。
- AM采取轮询的方式通过RPC向RM申请资源
- 一旦AM申请到资源,就会与NM通信,要求NM启动任务
- NM 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将 任务启动命令写到一个脚本中,并通过运行该脚本启动任务
- 各个任务通过某个 RPC 协议向 MRAppMaster 汇报自己的状态和进度,以让 MRAppMaster 随时掌握各个任务的运行状态,从而可以在任务败的时候重新启动任务
- 应用程序运行完成后,AM向 RM注销并关闭自己
六、Spark on YARN
YARN-Client
一般用于本地测试,Driver进程运行在本地,所以会和RM和AM产生大量网络通信,不过这种模式可以通过webUI访问Driver的状态,方便调试
流程:
- 提交应用程序后,Driver向YARN的ResourceManager申请资源启动NodeManager运行ApplicationMaster.
- ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,运行ApplicationMaster
- Client的SparkContext会与ApplicationMaster通信,同时向ResourceManager注册,根据任务信息向RM申请资源,启动NM.
- NM启动成功,会与AM通信,同时会向client中的SparkContext申请注册并申请TASK
- SparkContext会分配task给NM的Executor,执行任务,同时Executor会向Driver汇报任务的状态和进度,如果发现失败可以重启
- 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
YARN-Cluster
Spark的Driver作为一个ApplicationMaster在YARN集群中先启动,然后ApplicationMaster创建应用程序,然后为它向ResourceManager申请资源,并启动Executor来运行Task,同时监控它的整个运行过程,直到运行完成
流程:
- 提交应用程序,向RM申请资源启动NM运行AM
- 在AM中进行SparkContext的初始化
- AM向RM注册,这样就可以直接通过RM查看应用程序的运行状态,AM根据任务向RM申请资源启动NM,创建Executor
- Executor向AM中的SparkContext注册并申请任务
- AM分配Task给Executor,执行任务的同时向AM汇报状态和进度
- 应用程序执行结束,AM向RM申请并注销自己。