十七、Hadoop核心组件之Yarn

       本文主要介绍Hadoop的另一个核心组件——Yarn,Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。关注专栏《破茧成蝶——Hadoop篇》查看相关系列的文章~


目录

一、Yarn的基本架构

1.1 ResourceManager

1.1.1 调度器(Scheduler)

1.1.2 应用程序管理器(Applications Manager,ASM)

1.2 NodeManager

1.3 AplicationMaster

1.4 Container

二、Yarn工作机制

三、job提交到Yarn的过程

扫描二维码关注公众号,回复: 12047407 查看本文章

四、资源调度器

4.1 FIFO

4.2 Capacity Scheduler

4.3 Fair Scheduler


一、Yarn的基本架构

       YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。YARN总体上仍然是Master/Slave结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。如下图所示:

1.1 ResourceManager

       RM是一个全局的资源管理器,负责整个系统的资源管理和分配,在整个集群中只有一个。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

1.1.1 调度器(Scheduler)

       调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。此外,该调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler等。

1.1.2 应用程序管理器(Applications Manager,ASM)

       应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

1.2 NodeManager

       NodeManager整个集群有多个,负责单节点资源管理和使用。详细功能如下:(1)单个节点上的资源管理和任务管理。(2)处理来自ResourceManager的命令。(3)处理来自ApplicationMaster的命令。

1.3 AplicationMaster

       用户提交的每个应用程序均包含1个ApplicationMaster,主要功能包括:(1)与ResourceManager调度器协商以获取资源(用Container表示);(2)将得到的任务进一步分配给内部的任务;(3)与NodeManager通信以启动/停止任务;(4)监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

1.4 Container

       Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当ApplicationMaster向ResourceManager申请资源时,ResourceManager为ApplicationMaster返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。 需要注意的是,Container不同于MRv1中的slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。目前,YARN仅支持CPU和内存两种资源,且使用了轻量级资源隔离机制Cgroups进行资源隔离。

二、Yarn工作机制

       (1)MR程序提交到客户端所在的节点。(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等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。(14)ReduceTask向MapTask获取相应分区的数据。(15)程序运行完毕后,MR会向RM申请注销自己。

三、job提交到Yarn的过程

       1、作业提交
       (1)Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
       (2)Client向RM申请一个作业id。
       (3)RM给Client返回该job资源的提交路径和作业id。
       (4)Client提交jar包、切片信息和配置文件到指定的资源提交路径。
       (5)Client提交完资源后,向RM申请运行MrAppMaster。
       2、作业初始化
       (6)当RM收到Client的请求后,将该job添加到容量调度器中。
       (7)某一个空闲的NM领取到该Job。
       (8)该NM创建Container,并产生MRAppmaster。
       (9)下载Client提交的资源到本地。
       3、任务分配
       (10)MrAppMaster向RM申请运行多个MapTask任务资源。
       (11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
       4、任务运行
       (12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
       (13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
       (14)ReduceTask向MapTask获取相应分区的数据。
       (15)程序运行完毕后,MR会向RM申请注销自己。
       5、进度和状态更新
       YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
       6、作业完成
       除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。

四、资源调度器

       Hadoop作业调度器主要有三种:FIFO(先进先出调度器)、Capacity Scheduler(容量调度器)和Fair Scheduler(公平调度器)。Hadoop2.7.2默认的资源调度器是Capacity Scheduler。

       我们可以通过yarn-default.xml文件来看一下,这个文件存在于源码之中,具体可以参考《七、Hadoop源码编译》

4.1 FIFO

       按照达到时间排序,先到先服务。

4.2 Capacity Scheduler

       1、支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略。2、为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。3、首先计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列。4、其次按照作业优先级和提交时间顺序,同时考虑用户资源量限制和内存限制对队列内任务排序。5、多个队列同时按照任务的先后顺序依次执行,多个队列并行运行。

4.3 Fair Scheduler

       支持多队列多用户,每个队列中的资源量可以配置,同一个队列中的作业公平共享队列中的所有资源。例如有三个队列,每个队列中的job按照优先级分配资源,优先级越高分配的资源越多,但是每个job都会分配到资源以确保公平。在资源有限的情况下,每个job理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距叫做缺额。在同一个队列中,job的资源缺额越大,越先获得资源优先执行。作业是按照缺额的高低来先后执行的。

       本文到此也就结束了,你们在此过程中存在什么问题,欢迎留言,让我看看你们都遇到了什么问题~

猜你喜欢

转载自blog.csdn.net/gdkyxy2013/article/details/108169078
今日推荐