Hadoop学习笔记-Yarn(1)-Yarn概述与工作机制

Yarn概述

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序就相当于运行在操作系统上的应用程序。

1. 基础架构

Yarn的主要组件有:ResouceManager、NodeManager、ApplicationMaster和Container等组件构成。

  • ResouceManager:Yarn的老大,负责整个系统的资源管理和分配
    1. 处理客户端请求
    2. 监控其余的NodeManager
    3. 启动或监控ApplicationMaster
    4. 资源的分配和调度
  • NodeManager:Yarn的小弟,管理Yarn集群中每个节点上的资源和任务
    1. 管理单个节点上的资源
    2. 处理来自ResourceManager的命令
    3. 处理来自ApplicationMaster的命令
  • ApplicationMaster:管理在Yarn内运行的应用程序实例(客户端提交的单个任务)
    1. 为应用程序申请资源并分配给内部的任务
    2. 任务的监控与容错
    3. 一个任务的各个部分可能会在不同的NodeManager上运行
  • Container:Yarn中的资源抽象
    1. 封装了某个节点上的多维度资源,如内存、CPU、磁盘,网络等

2. 工作机制

回顾前面的阶段,Job提交阶段中,完成了对输入文件的切片,得到了切片规划文件、集群配置文件以及jar包,然后向Yarn提交任务。

需要运行任务,运行资源的时候,都需要向老大ResouceManager进行申请

  1. MapReduce程序提交到客户端所在的节点
  2. YarnRunner向ResourceManager申请一个Application,这个Application用于管理这个MapReduce程序,对应一个作业id
  3. ResourceManager返回该应用程序的资源路径
  4. YarnRunner接收到返回结果,让MapRedeuce提交运行所需要的资源
    • 运行所需要的资源包括Job.split 切片规划文件,Job.xml集群配置信息以及xxx.jar程序对应的jar包
  5. 程序资源提交完毕之后,申请运行MRAppMaster
  6. ResourceManager会将用户的请求初始化成为一个Task
  7. ResourceManager管理的所有Task会形成队列,以调度算法决定执行哪一个Task
  8. 之后其中一个NodeManger领取到这个Task任务
  9. 这个NodeManger创建容器Container,并产生MRAppmaster,管理任务的执行
  10. Container从HDFS上拷贝资源到本地
  11. MapReduce程序中需要运行MapTask,则MRAppmaster向ResouceManager申请对应的运行资源
  12. ResouceManager进行任务分配,则对应的NodeManger会领取任务并创建容器
  13. MRAppmaster向对应的NodeManger发送启动脚本,并等待所有的MapTask运行完成
  14. 运行完成之后,MRAppmaster再向ResouceManager申请资源运行ReduceTask
  15. ReduceTask向MapTask获取相应分区的数据
  16. 程序运行完成之后,MRAppmaster向ResouceManager申请注销自己

3. 作业提交流程

1)作业提交

  1. Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业
  2. Client向ResourceManager申请一个作业id
  3. ResourceManager返回job资源的提交路径和作业id
  4. Client提交jar包、切片信息和配置文件到指定的资源提交路径(提交到HDFS当中)
  5. Client资源提交完毕,向ResouceManager申请运行MRAppMaster

2)作业初始化

  1. ResourceManager收到申请之后,将该job添加到容量调度器当中
  2. 某个空闲的NodeManager领取该job
  3. 该NodeManager创建Container,并产生MRAppMaster
  4. 从HDFS上下载Client提交的资源到本地

3)任务分配

  1. MRAppMaster向ResourceManager申请运行多个MapTask的任务资源
  2. ResourceManager将运行MapTask任务分配给另外的NodeManager,对应的NodeManager领取任务并创建容器

4)任务运行

  1. MRAppMaster向接收到任务的NodeManager发送程序启动脚本,启动对应的任务
  2. MRAppMaster等待所有MapTask运行完毕之后,向ResourceManager申请资源运行ReduceTask
  3. ReduceTask从MapTask获取相应分区的数据
  4. 程序运行完毕之后,MRAppMaster向ResourceManager申请注销自己

5)进度和任务状态更新

  1. Yarn中的任务将其进度和状态返回给应用管理器,客户端每秒向应用管理器请求进度更新,展示给用户

    请求时间可以通过mapreduce.client.progressmonitor.pollinterval进行设置

6)作业完成

  1. 除了向应用管理器请求作业进度外,客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后,应用管理器和Container会清理工作状态。作业的信息会被历史服务器存储下来,以备后续的用户核查

    检查时间间隔可以通过mapreduce.client.completion.pollinterval进行设置

在其中会涉及到HDFS读写文件,MapReduce工作流程和Yarn工作流程,对应三张流程图。

Yarn调度器和调度算法

在Yarn调度任务的过程中存在调度器和调度算法的概念。目前,在Hadoop作业调度器主要有三种:FIFO调度器、容量调度器和公平调度器。

  • 在Apache Hadoop3.1.3默认的资源调度器是容量调度器
  • CDH框架默认是公平调度器

在Hadoop中的yarn-default.xml文件中可以查看具体配置,字段为yarn.resourcemanager.scheduler.class

1.先进先出调度器(FIFO)

FIFO调度器:指的是单队列的,根据提交作业的先后顺序进行服务。在FIFO调度器中可以存在同时执行的任务,分配资源的原则是,将资源分配给最先来的任务,后续的任务在有资源空余的情况下才能够执行。

  • 优点:简单易懂

  • 缺点:不支持多队列,在生产环境下很少使用

2.容量调度器(Capacity Scheduler)

容量调度器是Yahoo开发的多用户调度器,它的特点如下:

  • 支持多队列:可以配置多个队列,一个队列可以配置一定的资源量,同时在队列内部可以采用相应的调度策略(默认在队列内部使用FIFO调度算法)
  • 具有容量保证:对于每个队列,可以设置资源的最低保证和资源的使用上限(最少有多少资源,最多能使用多少资源)
  • 灵活性:如果一个队列有资源剩余的时候,可以暂时共享给那些需要资源的队列,但是当这个队列有新的程序提交的时候,外借的资源会进行归还(本队列对自己的资源有最高的使用优先权)
  • 多租户:可以支持多用户的集群共享以及多应用程序的共同运行(即在一个队列中可以根据用户进行划分;并且为了防止同一个用户的作业独占队列中的资源,可以对同一用户提交的作业所占的最大资源量进行限制)

容量调度器的资源分配机制:

容量调度器从root开始进行资源的分配:

  1. 队列资源分配:在初始设置的时候,可以为每个队列设置资源的占有比例。从root开始,使用深度优先算法,优先选择队列资源使用率最低的的队列分配资源。

    队列资源使用率:已经使用的资源量 / 队列的最小资源容量

    (其中队列的最小资源容量由管理员配置)

  2. 作业资源分配:在一个队列中会存在多个任务,默认按照提交作业的优先级和提交时间顺序进行资源分配

  3. 容器资源分配:在一个作业中涉及到多个Container,这些Container可能是多样化的,涉及不同的优先级、节点、资源量和数量。该如何为容器分配资源呢?按照容器的优先级进行分配,先为优先级高的Container分配资源。对于同一优先级,按照数据本地性原则进行分配,优先选择满足本地的Container,再依次满足其余的Container

    数据本地原则:

    1. 任务和数据在同一节点
    2. 任务和数据在同一机架
    3. 任务和数据不在同一节点也不在同一机架

3.公平调度器(Fair Scheduler)

公平调度器是Fackbook开发的多用户调度器,它和容量调度器存在相同点和不同点:

与容量调度器的相同点

  1. 支持多队列:支持多队列多作业
  2. 具有容量保证:每个队列同样具有资源的最低保证和资源的使用上限
  3. 灵活性:资源能够共享,同时本队列对自己的资源具有最高使用优先权
  4. 多租户:多用户集群共享,多应用程序共同运行,同时对同一用户提交的作业所占的最大资源量进行限制

与容量调度器的不同点

  1. 核心调度策略不同
    • 容量调度器:优先选择资源使用率低的队列
    • 公平调度器:优先选择对资源缺额比例大的
  2. 每个队列可以单独设置资源分配方式
    • 容量调度器:FIFO、DRF
    • 公平调度器:FIFO、FAIR、DRF

公平分配器如其名,为了实现公平。但是何为公平?这里的公平是通过权重来体现的,而我们默认的公平就对应了权重全为1。

公平调度器的资源分配机制:

在每个队列中设置的资源分配方式

  • FIFO策略:公平调度器每个队列资源分配采用FIFO的话,则此时公平调度器相当于上面讲过的容量调度器

  • FAIR策略:FAIR策略是一种最大最小公平算法,它的思想是最大化系统中每个用户收到的最小分配资源。

    假设每个用户都有足够的请求,即资源无法空余,则这种策略会给每个用户一份均等资源。而广义上的最大最小公平算法包括权重的概念,用户可以获得与它的权重成正比的一份资源,也即我们前面所说的公平的定义。

    当然如果分配给用户的资源有溢出,则空闲部分可以再分给其余任务。

  • DRF策略:DRF基于最大最小公平算法改进而来,不同的是最大最小算法只支持某一种单一资源的分配,而DRF支持多种资源的分配,并且最大化每个任务的主资源的最小分配资源

    DRF首先会计算任务是CPU密集型资源还是内存密集型资源,具体来说就是利用任务需要的资源除以系统的总资源得到两个比例,哪个比例大则这个任务的主资源就是对应的资源。

    之后,每次迭代都要选择一个任务进行资源分配,选择方法是选择当前主资源占总资源占比最小的那个任务

FAIR分配举例:

  • 溢出资源会分配给需要资源的任务
  • 不加权的情况是加权的特殊情况,即所有权重都相同

参考文章

  1. Yarn公平调度器之DRF算法 - 开发者知识库 (itdaan.com)
  2. Yarn的CapacityScheduler与DRF了解_淡定一生2333的博客-CSDN博客

Hadoop学习笔记-Yarn(1)-Yarn概述与工作机制
http://example.com/2022/02/23/Hadoop学习笔记-Yarn-1-Yarn概述与工作机制/
作者
EverNorif
发布于
2022年2月23日
许可协议