YARN基础知识

1. 简介

1.1 概述

YARN,全称为Yet Another Resource Negotiator,是Apache Hadoop生态系统中的一个关键组件,用于资源管理和工作调度。YARN的设计目标是使Hadoop不仅仅局限于MapReduce,而是成为一个通用的分布式计算平台,能够支持多种计算框架。

1.2 特点

  • 多框架支持:YARN使得Hadoop能够支持多种计算框架,如MapReduce、Spark、Tez、Storm等,这些框架可以在同一个集群中共享资源。

  • 资源隔离:YARN提供了一个隔离环境,确保应用程序之间的资源使用不会相互干扰。

  • 高可用性:YARN的设计考虑了故障恢复和容错机制,提高了系统的稳定性和可靠性。

  • 灵活性:YARN的调度器可以定制,以适应不同应用场景的资源需求。

2. 组成和架构

2.1 ResourceManager(RM)

  • ResourceManager 是YARN集群的主控节点,负责整个集群的资源管理和调度。它包含两个主要组件:

    • Scheduler: 负责将可用的资源分配给提交到集群的应用程序。YARN提供了几种类型的调度器,如FIFO Scheduler(先进先出)、Capacity Scheduler(容量调度器)和Fair Scheduler(公平调度器)。

    • ApplicationsManager (AM): 负责接收应用程序的提交,为每个应用程序启动ApplicationMaster,并监控它们的运行状态,必要时进行重启。

2.2 NodeManager (NM)

  • NodeManager 是YARN集群的工作节点,负责在单个节点上管理资源(如CPU、内存)和执行任务。它与ResourceManager协同工作,接收来自ResourceManager的指令,并管理在本地节点上运行的容器(Container)。

2.3 ApplicationMaster (AM)

  • ApplicationMaster 是每个应用程序的管理者,负责与ResourceManager协商资源,从NodeManager启动和监控任务容器,并管理应用程序的生命周期。每个提交到YARN的应用程序都有一个ApplicationMaster。

2.4 Container

  • Container 是YARN中资源分配的基本单位,由NodeManager创建和管理。它封装了特定的资源,如CPU和内存,供应用程序使用。

3. 工作流程

  1. Mr 程序提交到客户端所在的节点( MapReduce )

  2. yarnrunner 向 Resourcemanager 申请一个 application 。

  3. rm 将该应用程序的资源路径返回给 yarnrunner。

  4. 该程序将运行所需资源提交到 HDFS 上

  5. 程序资源提交完毕后,申请运行 mrAppMaster

  6. RM 将用户的请求初始化成一个 task

  7. 其中一个 NodeManager 领取到 task 任务。

  8. 该 NodeManager 创建容器 Container ,并产生 MRAppmaster

  9. Container 从 HDFS 上拷贝资源到本地

  10. MRAppmaster 向 RM 申请运行 maptask 容器

  11. RM 将运行 maptask 任务分配给另外两个 NodeManager ,另两个 NodeManager 分别领取任务并创建容器。

  12. MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 maptask , maptask 对数据分区排序。

  13. MRAppmaster 向 RM 申请 2 个容器,运行 reduce task 。

  14. reduce task 向 maptask 获取相应分区的数据。

  15. 程序运行完毕后, MR 会向 RM 注销自己。

4. 调度器和调度算法

4.1 FIFO调度器(First In First Out)

FIFO调度器:单队列,根据提交作业的先后顺序,先来先服务。

同一时间只能有一个任务执行。这是因为FIFO Scheduler遵循先进先出的原则,即首先提交的任务将首先获得资源并开始执行,而后续提交的任务必须等待前面的任务完成或释放资源后才能开始。因此在实际运行中通常不会选择使用该调度器。

4.2 容量调度器(Capacity Scheduler)

4.2.1 特点
  • 多队列:可以存在多个任务队列。每个队列可配置一定的资源量,每个队列采用FIFO调度策略。任务所需资源都满足的情况下,一个队列中可以启动多个任务。

  • 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。

  • 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,但是不能超过队列的资源使用上线。而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。

  • 多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

4.2.2 资源分配算法
  1. 队列资源分配:首先考虑队列的最小资源保证,确保每个队列至少得到其保证的资源份额。然后剩余的资源就按照各个队列的权重(优先级)进行分配。

假设有三个队列A,B,C。A,B,C的最小资源保证都是10%,权重分别是3,2,2。那么首先给A,B,C三个队列都分配10%的资源。然后剩下的70%资源按照权重进行分配,A再分配30%,B和C都分配20%。
因此最后各个队列占用资源比例:A:40%;B:30%;C:30%。
  1. 作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源。

  2. 容器资源分配:

  • 按照容器的优先级分配资源

  • 如果优先级相同,按照数据的本地性原则:

    • 任务和数据在同一节点上

    • 任务和数据在同一机架

    • 任务和数据不在同一节点上,也不在同一机架上

层级图如下:

4.3 公平调度器(Fair Scheduler)

Fair调度器是YARN中常用的一种调度器,它旨在公平地共享集群资源,避免其中一个应用程序垄断资源。

Fair调度器基于公平共享的原则,根据各个应用程序的需求和优先级,动态地分配集群资源。在Fair调度器中,所有的应用程序被视为同等重要,每个应用程序都有一定的权重。调度器会根据应用程序的权重和资源需求来分配资源,以达到公平和均衡的资源分配。

4.3.1 特点

公平调度器的特点和容量调度器相同。

  1. 多队列:每隔队列可配置一定的资源,每个队列内部采用先进先出的调度策略。

  2. 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。

  3. 资源灵活:如果一个队列中的资源有剩余,可以暂时共享给哪些需要资源的队列,而一旦该队列有新的作业提交,则其他队列借调的资源会归还给该队列。

  4. 多租户:支持多用户共享集群和多作业同时运行;为了防止一个用户的作业独占队列中的资源,可以对用户提交作业所使用的资源进行限定。

4.3.2 作业资源分配
  • 作业未加权(即所有作业的权重相等):

需求:有一条队列总资源12个, 有4个job,对资源的需求分别是: 
job1->1,  job2->2 , job3->6,  job4->5
​
第一次算:  12 / 4 = 3 (平均分配资源)
    job1: 分3 --> 多2个 
    job2: 分3 --> 多1个
    job3: 分3 --> 差3个
    job4: 分3 --> 差2个
​
第二次算: 3 / 2  = 1.5 (多余的资源平均分配给缺少资源的任务)
    job1: 分2个出去->剩余1个,满足需求
    job2: 分1个出去->剩余2个,满足需求
    job3和job4平均分配。
    job3:3/2=1.5个-> 差1.5个
    job4:3/2=1.5个-> 差0.5个
​
第n次算: 一直算到没有空闲资源可以分配为止。
  • 作业加权

需求:有一条队列总资源16,有4个job 
对资源的需求分别是: 
job1->4   job2->2  job3->10  job4->4 
每个job的权重为:   
job1->5   job2->8  job3->1   job4->2
​
第一次算: 16 / (5+8+1+2) =  1(按照权重进行分配)
    job1:  分5 --> 多1
    job2:  分8 --> 多6
    job3:  分1 --> 少9
    job4:  分2 --> 少2            
​
第二次算: 7 / (1+2) = 7/3(多余的资源按照任务的权重分配给缺少资源的任务)
    job1: 分1个出去->剩余4个,满足需求
    job2: 分6个出去->剩余2个,满足需求
    job3和job4按照权重比值进行分配
    job3: 分7/3(2.33) -->少6.67
    job4: 分14/3(4.66) -->多2.66
​
第三次算:2.66/1=2.66 (多余的资源按照任务的权重分配给缺少资源的任务)
    job1: 剩余4个,满足需求
    job2: 剩余2个,满足需求
    job3: 分2.66/1 --> 最后得到资源6个
    job4: 分2.66出去->剩余4个,满足需求
第n次算: 一直算到没有空闲资源

4.4 调度策略

每个队列可设置的调度策略不同 容量调度器:FIFO、DRF;

公平调度器:FIFO、FAIR、DRF。

4.4.1 FIFO策略

公平调度器每个队列资源分配策略如果选择FIFO的话,此时公平调度器相当于上面讲过的容量调度器。

4.4.2 Fair策略

Fair 策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。

具体资源分配流程和容量调度器一致:选择队列、选择作业、选择容器,以上三步,每一步都是按照公平策略进行资源的分配。

4.4.3 DRF策略

DRF(Dominant Resource Fairness),在进行作业资源分配的分配时同时考虑内存和CPU。

例如集群中一共用100CPU和10TB的内存,作业A需要(2CPU,300GB),作业B需要(6CPU,100GB),在集群中两个作业分别需要(2%CPU,3%内存)、(6%CPU,1%内存)的资源,这表示作业A是内存主导的,作业B是CPU主导的,针对这种场景,可以考虑引入DRF策略对不同的作业进行内存和CPU的限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值