谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?

谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?

YARN的架构与运行机制

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

YARN的架构

ResourceManager管理节点

ResourceManager节点的功能:
1、负责管理集群
2、负责接收客户端请求
3、记录运行过的程序的一些信

NodeManager计算节点

1、负责管理自己所在机器的CPU和内存
2、接受主节点分配的任务,使用自己的CPU和内存来运行任务

YARN的运行机制

一个MapReduce程序在YARN上运行的过程如下:

谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?
( 0 ) Mr 程序提交到客户端所在的节点( MapReduce )
( 1 ) yarnrunner 向 Resourcemanager 申请一个 application 。
( 2 ) rm 将该应用程序的资源路径返回给 yarnrunner
( 3 )该程序将运行所需资源提交到 HDFS 上
( 4 )程序资源提交完毕后,申请运行 mrAppMaster
( 5 ) RM 将用户的请求初始化成一个 task
( 6 )其中一个 NodeManager 领取到 task 任务。
( 7 )该 NodeManager 创建容器 Container ,并产生 MRAppmaster
( 8 ) Container 从 HDFS 上拷贝资源到本地
( 9 ) MRAppmaster 向 RM 申请运行 maptask 容器
( 10 ) RM 将运行 maptask 任务分配给另外两个 NodeManager ,另两个 NodeManager 分别领取任务并创建容器。
( 11 ) MR 向两个接收到任务的 NodeManager 发送程序启动脚本,这两个 NodeManager 分别启动 maptask , maptask 对数据分区排序。
( 12 ) MRAppmaster 向 RM 申请 2 个容器,运行 reduce task 。
( 13 ) reduce task 向 maptask 获取相应分区的数据。
( 14 )程序运行完毕后, MR 会向 RM 注销自己。

YARN的资源管理与任务调度

YARN的资源管理

本质:将多台机器的资源进行统一化管理

  • 每台NodeManager会管理自己这台机器的CPU和内存
  • ResourceManager管理所有的NodeManager
    • 会将每个小任务分配给不同的NodeManger
    • 让NodeManager使用自己机器的资源来运行的小任务

YARN的任务调度机制

YARN中有三种任务调度器:FIFO调度器(FIFO Scheduler)、容量调度器(Capacity Scheduler)、公平调度器(Fair Scheduler)。

FIFO调度器(FIFO Scheduler)

最初Hadoop使用的就是FIFO这种非常简单的任务调度机制,所有的作业都被统一提交到一个队列中,优先给队列中的第一个任务分配资源,第一个任务资源满足后再给下一个分配,以此类推。

谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?
FIFO调度器的优点是,简单易懂,不需要任何配置,但是不适合共享集群。大的应用会占用集群的所有资源,所以每个应用必须等待直到轮到自己执行。在一个共享集群中,更适合使用容量调度器和公平调度器。这两种调度器都允许长时间运行的作业能及时完成,同时也允许正在进行较小临时查询的用户能够在合理的时间内得到返回的结果。

容量调度器(Capacity Scheduler)

在使用容量调度器时,一个独立的专门队列保证小作业一提交就可以启动,由于队列容量是为那个队列中的作业所保留的,因此这种策略是以整个集群的利用率为代价的。这意味着与使用FIFO调度器相比,大作业执行的时间要长。

谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?
队列内部是以FIFO方式调度的。正常情况下,Capacity Scheduler不会强行通过强行终止来强占容器。意思就是说,随着任务的增多,资源不够用时并且队列中的资源被其他队列给强占了,它只能等待其他队列释放资源。一般可以通过设置其他队列的最大容量来环节这种情况,这个就是需要权衡的地方。

公平调度器(Fair Scheduler)

谁来跟我聊四毛钱的分布式资源管理与任务调度框架——YARN?

从图上可以看出,它不需要预留资源,因为调度器会在运行的作业之间动态平衡资源:第一个作业(用户A)启动时,由于是唯一运行的任务,所以它独占全部资源.当第二个作业(用户B)启动时,它会分配到一半资源.当然,第二个作业从启动到获得公平共享资源的时间会有滞后,因为必须等待第一个任务的容器用完并释放出资源,当第二个作业完成后,第一个作业会再次独占全部资源。
不同的是Fair Scheduler实现了更多样化的调度策略,它允许每个队列单独配置调度策略(schedulingPolicy),分别有:FIFO/Fair/DRF,默认使用的是Fair。而且Fair Scheduler实现了抢占功能,允许调度器Kill掉超过其应占份额资源队列的Containers(公平的定义),需要注意抢占会降低集群的执行效率,因为被终止的containers需要被重新执行。