Yarn相关
产生背景
YARN是在MRv1基础上演化而来的,它克服了MRv1中的中的各种局限性。
MRv1架构
首先先说MRv1有哪些局限性:
- 扩展性差。在MRv1中,JobTracker同时兼备了资源管理和作业控制两个功能,这成为系统的一个最大瓶颈,严重制约了Hadoop的可扩展性。
- 可靠性差。 MRv1采用了master/slave结构,其中,master存在单点故障问题,一旦master出现故常将导致整个集群不可用
- 资源利用率低。 MRv1采用了基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完槽位对应的资源,且其他任务也无法使用这些空闲资源,此外,Hadoop将槽位分为Map Slot和Reduce Slot两种,且不允许它们之间共享,常常会导致一种槽位资源紧张而另一种闲置(比如一个作业刚刚提交时,只会运行Map Task,此时Reduce Slot闲置)
- 无法支持多种计算框架。 随着互联网告诉发展,MR这种基于磁盘的离线计算框架已经不能满足应用的要求,从而出现了一些新的计算框架,包括内存计算框架、流式计算框架和迭代计算框架等,而MRv1不能支持多种计算框架并存
所以为了客服以上几个缺点,Apache开始对Hadoop进行升级改造,Mrv2将资源管理功能抽象成了一个独立的通用系统YARN,直接导致下一代MR的核心从单一的计算框架MR转移为通用的资源管理系统YARN,Hadoop2.x版本打造了一个以YARN为核心的生态系统。
以YARN为核心的弹性计算平台的基本架构
版本介绍
(1)Hadoop 1.0
Hadoop1.0由分布式存储系统HDFS和分布式计算框架MapReduce组成,其中,HDFS由一个NameNode和多个DataNode组成,MapReduce由一个JobTracker和多个TaskTracker组成。
(2)Hadoop 2.0
Hadoop2.0为克服Hadoop1.0中HDFS和MapReduce存在的各种问题而提出的。针对1.0版本中的单NameNode制约HDFS的扩展性问题,提出了HDFS Fedreation,它让多个NameNode分管不同的目录而实现访问隔离和横向扩展,同时它彻底解决了NameNode单点故障问题;针对Hadoop 1.0中的 MR在扩展性和多框架之处方面的不足,它将JobTracker中的资源管理和作业控制拆分开,分别由ResourceManager和ApplicationMaster实现,其中,ResourceManager负责所有应用程序的资源分配,而ApplicationMastere仅负责管理一个应用程序,进而诞生了全新的通用资源管理框架Yarn
Yarn不仅限于MR一种框架使用,也可以供其他框架使用,比如Spark、Storm等
HDFS Fedration:为了使NameNode可以横向扩展成多个,每个NameNode分管一部分目录,进而产生HDFS Federation,该机制的进入不仅增强了HDFS的扩展性,也使得HDFS具备了隔离性。
YARN基本架构
Yarn的基本组成:ResourceManager、NodeManager、ApplicationMaster(图中给出了MR和MPI两种计算框架的ApplicationMaster,分别为MR AppMster和MPI AppMster)和Container等几个组件构成。
Yarn两个基本的服务:
一个全局的资源管理器ResourceManager和每个应用程序(Job)特有的ApplicationMaster
1、ResourceManager(RM):负责整个系统的资源管理和分配。它主要有两个组件构
成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
(1)调度器
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container。简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可以根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如FairScheduleer和CapacityScheduler等。
(2)应用程序管理器
应用程序管理器复制管理整个系统中所有应用程序,包括应用程序提交、与调度器 协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
2、ApplicationMaster(AM)
用户提交的每个一个应用程序均包含一个AM,主要功能包括;
- 与RM调度器协商以获取资源(用Container表示)
- 将得到的任务进一步分配给内部的任务
- 与NodeManager通信以启动/停止任务
- 监控所有任务的运行状态,并在任务运行失败时重新为任务申请资源以重启任务
3、NodeManager(NM)
NM是每个节点上的资源和任务管理器,一方面它会定时向RM汇报本节点上资源使用情况和各个Container的运行状态;另一方面它接收并处理来自AM的Container启动/停止等各种请求。
4、Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等(Yarn目前只吃菜CPU和内存两种资源),当AM向RM申请资源时,RM为AM返回的资源便是Container表示的。YARN会为每一个人物分配一个Container,且该人物只能使用该Contatiner中描述的资源。需要注意的是,Container不同于MRv1中的solt,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。
YARN的工作流程
当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段是启动AM;第二个阶段是由AM创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
- 用户向YARN中提交应用程序,其中包括AM程序、启动AM的命令、用户程序等。
- RM为该应用程序分配第一个Container,并选择一个相对空闲的NodeManager通信,要求它在这个Container中启动应用程序的AM。
- AM首先向RM注册,这样用户可以直接通过RM查看应用程序的运行状态,然后它将为各个任务向RM申请资源,RM的资源调度器Scheduler为任务返回一个Container,AM监控任务的运行状态,直到运行结束。
- AM采用轮询的方式通过RPC协议向RM申请和领取资源。
- 一旦AM申请到资源便与对应的NM通信,要求它启动任务
- NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务命令写到一个脚本中,并通过运行该脚本启动任务,定时向RM发送心跳,报告该节点的可用资源情况,通信的端口和后续状态的维护。
- 各个任务通过某个RPC协议向AM汇报自己的状态和执行进度,以让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
- 应用程序运行完成之后,AM向RM注销并关闭自己