为了能够对集群中的资源进行统一管理和调度,Hadoop 2.0 引入了YARN,大大提高了集群的资源利用率,并提供了容错,资源隔离及负载均衡等方面的支持.
YARN是在MRv1(MapReduce version 1)的基础上演化而来的,这里可以先简单了解一下MRv1的局限性:
- 可靠性差:MRv1采用ms结构,但master存在单点故障问题
- 扩展性差:JobTracker 同时兼备了资源管理和作业控制俩个功能
- 资源利用率低:MRv1采用了基于槽位的资源分配模型,常常导致资源闲置
- 无法支持多种计算框架:只支持基于磁盘的离线计算MapReduce
随着互联网发展和实际需求,Apache对其进行升级改造,从而出现MRv2,即后来通用的资源管理系统YARN.
YARN的基本架构
YARN同样采用ms架构,ResourceManage为master,NodeManager为slave,RM负责对各个NM上的资源进行统一管理和调度.当用户提交一个应用程序(作业)时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,AM负责向RM申请资源,并要求NM启动可以占用一定资源的任务,由于不同的AM会被分布到不同的节点上,因此它们之间互不影响.
- ResourceManager
RM是一个全局的资源管理器,负责整个系统的资源管理和分配,它主要由俩个组件构成:调度器(Scheduler)和应用管理器(Applications Manager)
调度器:主要功能是根据资源容量,队列等方面的限制条件,将系统中的资源分配给各个应用程序,分配单位是Container.在YARN中资源调度器是一个可插拔的组件,用户可自己设计,目前提供的有Fair Scheduler和Capacity Scheduler(默认).
应用管理器:负责管理整个系统中所有的应用程序,包括应用程序提交,启动AM,监控AM运行状态及重启它. - ApplicationMaster
用户提交的每一个应用程序均包含一个独立的AM,不同的计算框架和服务需要自行实现AM,主要功能包括:
与RM调度器协商获取资源,将得到的资源进一步分配给内部的任务,与NM通信来启动和停止任务,监控任务的运行状态和重启任务. - NodeManager
每个节点上的资源管理器,定时向RM汇报本节点上资源使用情况和各个Container的运行状态,接受来自AM的任务启停请求. - Container
基本分配资源单位,是对应用程序运行环境的抽象,并为应用程序提供资源隔离环境.
YARN的工作流程
当用户向YANR提交一个应用程序后,YARN分为俩个阶段运行该应用程序,一是启动AM,二是由AM创建应用程序,为它申请资源,并监控整个运行过程直至成功.
- 提交应用程序:用户通过客户端与YARN RM通信提交程序,程序中包含可执行代码,资源需求,优先级,队列信息等.
- 启动AM:RM为该应用程序分配第一个Container,并于对应的NM通信,要求它在这个Container启动AM,之后AM的生命周期被RM管理.
- AM注册:AM启动后,会向RM(应用管理器)注册,然后重复4-7.
- 资源获取:AM 采用轮询方式通过RPC协议向RM申请和领取资源 .
- 请求启动Container:AM一旦申请到资源,会与对应的NM通信,请求启动任务,NM会将任务放到Container.
- 启动Container:NM为任务设置好运行环境(包括环境变量,jar包,二进制程序等)后,将启动任务命令写到一个脚本中,通过ContainerExecutor运行该脚本启动任务.
- Container监控:AM获取各个Container的运行状态以便任务失败时重启
- 注销AM:任务结束,AM向RM注销,退出执行
YARN的调度器后续会做详细介绍