文章目录

  • 关于YARN
  • 1. MapReduce1.0的缺陷
  • 2. YARN设计思路
  • 3. YARN体系结构
  • 4. YARN工作流程
  • 5. YARN的发展目标


关于YARN


1. MapReduce1.0的缺陷

  • 存在单点故障
  • JobTracker"大包大榄",导致任务过重(任务多时内存开销大,上限4000节点)
  • 容易出现内存溢出(分配资源只考虑MapReduce任务数,不考虑CPU、内存)
  • 资源划分不合理(强制划分为slot,包括Map slot和Reduce slot)

MapReduce1.0的体系结构

yarn内存核数分配不均 yarn 内存不足_资源管理


2. YARN设计思路

Apache YARN(Yet Another Resource Negotiator)是Hadoop的集群资源管理系统,YARN被引入Hadoop 2,最初是为了改善MapReduce的实现,但它具有足够的通用性,同样可以支持其他的分布式计算模式。

yarn内存核数分配不均 yarn 内存不足_yarn内存核数分配不均_02

  • MapReduce1.0既是一个计算框架,也是一个资源管理调度框架。
  • 到了Hadoop2.0以后,MapReduce1.0中的资源管理调度功能,被单独分离出来形成了YARN,它是一个纯粹的资源管理调度框架,而不是一个计算框架。
  • 被剥离了资源管理调度功能的MapReduce框架就变成了MapReduce2.0,它是运行在YARN之上的一个纯粹的计算框架,不再自己负责资源调度管理服务,而是由YARN为其提供资源管理调度服务。

3. YARN体系结构

yarn内存核数分配不均 yarn 内存不足_资源管理_03


ResourceManager

  • ResourceManager(RM)是一个全局的资源管理器,负责整个系统的资源管理和分配,主要包括两个组件,即 调度器(Schedular)应用程序管理器(Applications Manager)
  • 调度器接受来自ApplicationMaster的应用程序资源请求,把集群中的资源以"容器"的形式分配给提出申请的应用程序,容器的选择通常会考虑应用程序所要处理的数据的位置,进行就近选择,从而实现"计算向数据靠拢"。
  • 容器(Container)作为动态资源分配单位,每个容器中都封装了一定数量的CPU、内存、磁盘等资源,从而限定每个应用程序可以使用的资源量。
  • 调度器被设计成是一个可插拔的组件,YARN不仅自身提供了许多中直接可用的调度器,也允许用户根据自己的需求重新设计调度器。
  • 应用程序管理器(Applications Manager)负责系统中所有应用程序的管理工作,主要包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动等。

YARN有三种调度器可用,FIFO调度器(FIFO Scheduler),容器调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)。详细介绍看参考Hadoop权威指南p85。

ApplicationMaster

ResourceManager接受用户提交的作业,按照作业的上下文信息以及从NodeManager收集来的容器状态信息,启动调度过程,为用户作业启动一个ApplicationMaster。

ApplicationMaster的主要功能是:

  • 当用户提交作业时,ApplicationMaster与ResourceManager协商获取资源,ResourceManager会以容器的形式为Application分配资源。
  • 把获取的资源进一步分配给内部的各个任务(Map任务或Reduce任务),实现资源的"二次分配"。
  • 与NodeManager保持交互通信进行应用程序的启动、运行、监控和停止,监控申请到的资源的使用情况,对所有任务的执行进度和状态进行监控,并在任务发生失败时执行失败恢复(即重新申请资源重启任务)。
  • 定时向ResourManager发送"心跳"消息,报告资源的使用情况和应用的进度信息。
  • 当作业完成时,ApplicationMaster向ResourceManager注销容器,执行周期完成。

NodeManager
NodeManager是驻留在一个YARN集群中的每个节点上的代理,主要负责:

  • 容器生命周期管理。
  • 监控每个容器的资源(CPU、内存等)使用情况。
  • 跟踪节点健康状态。
  • 以"心跳"的方式与ResourceManager保持通信。
  • 向ResourceManager汇报作业的资源使用情况和每个容器的运行状态。
  • 接受来自ApplicationMaster的启动/停止容器的各种请求。

需要说明的是,NodeManager主要负责管理抽象的容器,只处理与容器相关的事情,而不具体负责每个任务(Map任务或Reduce任务)自身状态的管理,因为这些管理工作是由ApplicationMaster完成的,ApplicationMaster会通过不断与NodeManager通信来掌握各个任务的执行状态。

yarn内存核数分配不均 yarn 内存不足_资源管理_04

4. YARN工作流程

yarn内存核数分配不均 yarn 内存不足_应用程序_05


step1: 用户编写客户端应用程序,向YARN提交应用程序,提交的内容包括ApplicationMaster程序,启动ApplicationMaster的命令,用户程序等。

step2: YARN中的ResourceManager负责接收和处理来自客户端的请求,为应用程序分配一个容器,在该容器中启动一个ApplicationMaster。

step3: ApplicationMaster被创建后会首先向ResourceManager注册。

step4: ApplicationMaster采用轮询的方式向ResourceManager申请资源。

step5: ResourceManager以"容器"的形式向提出申请的ApplicationMaster分配资源。

step6: 在容器中启动任务(运行环境、脚本)。

step7: 各个任务向ApplicationMaster汇报自己的状态和进度。

step8: 应用程序运行完成后,ApplicationMaster向ResourceManager的应用程序管理器注销并关闭自己。


5. YARN的发展目标

yarn内存核数分配不均 yarn 内存不足_yarn内存核数分配不均_06

  • YARN的目标就是实现"一个集群多个框架",即在一个集群上部署一个统一的资源调度管理框架YARN,在YARN之上可以部署其他各种计算框架。
  • 由YARN为这些计算框架提供统一的资源调度管理服务,并且能够根据各种计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性收缩。
  • 可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率。
  • 不同计算框架可以共享底层存储,避免了数据集跨集群移动。