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. 工作流程
-
Mr 程序提交到客户端所在的节点( MapReduce )
-
yarnrunner 向 Resourcemanager 申请一个 application 。
-
rm 将该应用程序的资源路径返回给 yarnrunner。
-
该程序将运行所需资源提交到 HDFS 上
-
程序资源提交完毕后,申请运行 mrAppMaster
-
RM 将用户的请求初始化成一个 task
-
其中一个 NodeManager 领取到 task 任务。
-
该 NodeManager 创建容器 Container ,并产生 MRAppmaster
-
Container 从 HDFS 上拷贝资源到本地
-
MRAppmaster 向 RM 申请运行 maptask 容器
-
RM 将运行 maptask 任务分配给另外两个 NodeManager ,另两个 NodeManager 分别领取任务并创建容器。
-
MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 maptask , maptask 对数据分区排序。
-
MRAppmaster 向 RM 申请 2 个容器,运行 reduce task 。
-
reduce task 向 maptask 获取相应分区的数据。
-
程序运行完毕后, MR 会向 RM 注销自己。
4. 调度器和调度算法
4.1 FIFO调度器(First In First Out)
FIFO调度器:单队列,根据提交作业的先后顺序,先来先服务。
同一时间只能有一个任务执行。这是因为FIFO Scheduler遵循先进先出的原则,即首先提交的任务将首先获得资源并开始执行,而后续提交的任务必须等待前面的任务完成或释放资源后才能开始。因此在实际运行中通常不会选择使用该调度器。
4.2 容量调度器(Capacity Scheduler)
4.2.1 特点
-
多队列:可以存在多个任务队列。每个队列可配置一定的资源量,每个队列采用FIFO调度策略。任务所需资源都满足的情况下,一个队列中可以启动多个任务。
-
容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
-
灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,但是不能超过队列的资源使用上线。而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
-
多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
4.2.2 资源分配算法
-
队列资源分配:首先考虑队列的最小资源保证,确保每个队列至少得到其保证的资源份额。然后剩余的资源就按照各个队列的权重(优先级)进行分配。
假设有三个队列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%。
-
作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源。
-
容器资源分配:
-
按照容器的优先级分配资源
-
如果优先级相同,按照数据的本地性原则:
-
任务和数据在同一节点上
-
任务和数据在同一机架
-
任务和数据不在同一节点上,也不在同一机架上
-
层级图如下:
4.3 公平调度器(Fair Scheduler)
Fair调度器是YARN中常用的一种调度器,它旨在公平地共享集群资源,避免其中一个应用程序垄断资源。
Fair调度器基于公平共享的原则,根据各个应用程序的需求和优先级,动态地分配集群资源。在Fair调度器中,所有的应用程序被视为同等重要,每个应用程序都有一定的权重。调度器会根据应用程序的权重和资源需求来分配资源,以达到公平和均衡的资源分配。
4.3.1 特点
公平调度器的特点和容量调度器相同。
-
多队列:每隔队列可配置一定的资源,每个队列内部采用先进先出的调度策略。
-
容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
-
资源灵活:如果一个队列中的资源有剩余,可以暂时共享给哪些需要资源的队列,而一旦该队列有新的作业提交,则其他队列借调的资源会归还给该队列。
-
多租户:支持多用户共享集群和多作业同时运行;为了防止一个用户的作业独占队列中的资源,可以对用户提交作业所使用的资源进行限定。
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的限制。