Yarn的基本思想是将JobTracker
的资源管理和作业的调度/监控两大主要职能拆分为两个独立的进程:一个全局的Resource Manager
和每个应用对应的Application Master
(AM)。Resource Manager和每个节点上的Node Manager
(NM)组成了全新的通用操作系统,以分布式的方式管理应用程序。
Resource Manager拥有为系统中所有应用分配资源的决定权。与之相关的是应用程序的Application Master,负责与Resource Manager协商资源,并于Node Manager协同工作来执行和监控任务。
Resource Manager有一个可插拔的调度器组件Scheduler
,它负责为运行中的各种应用分配资源,分配时会受到容量、队列以及其他因素的制约。Scheduler是一个纯粹的调度器,不负责应用程序的监控和状态跟踪,也不保证在应用程序失败或者硬件失败的情况下对Task的重启。Scheduler基于应用程序的资源的需求来指定其调度功能,使用了成为资源Contrainer
的抽象概念,其中包括了多种资源维度,例如内存、CPU、磁盘以及网络。
Node Manager是与每台机器对应的从属进程(Slave),负责启动应用程序的Container,监控它们的资源使用情况(CPU、内存、磁盘和网络),并且报告给Resource Manager。
每个应用程序的Application Master负责与Scheduler协商合适的Container,跟踪应用程序的状态,以及监控它们的进度。从系统的角度看,Application Master也是以一个普通Container的身份运行的。
Yarn Resource Manager是一个纯粹的调度器,它负责整个系统的资源管理和分配。它本身主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager
: ASM)
Resource Manager是一个全局的资源管理器,集群只有一个active的对外提供服务
调度器(Scheduler)
纯调度器
”
资源容器
”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。公平调度器
(Fair Scheduler)和容量调度器
(Capacity Scheduler)应用程序管理器(Applications Manager,ASM)
Yarn的另一个重要概念就是Application Master。 Application Master实际上是特定框架库的一个实例,负责与Resource Manager协商资源,并和Resource Manager协同工作来执行和监控Container,以及它们的资源小号。它有责任与Resource Manager协商并获取合适的资源Container,跟踪它们的状态,以及监控其进展。
Application Master和应用是相互对应的,它主要的职责有:
在真实环境下,每一个应用都有自己的Application Master实例,然而,为一组应用提供一个Application Master是完全可行的,比如Pig或者是Hive的Application Master。
Application Master 与 Resource Manager 之间的通信
Node Manager是每个节点的框架代理。它负责启动应用的Container,监控Container的资源使用(包括CPU、内存、硬盘和网络带宽等),并把这些用信息汇报给调度器。应用对应的Application Master负责通过协商从调度器处获取Container,并跟踪这些Container的资源状态和应用执行情况。集群每个节点上都有一个Node Manager,它主要负责:
应用程序可以继续使用本地存储资源,即使它没有从Resource Manager处申请,例如,MapReduce可以利用这个服务存储Map Task的中间输出结果,并将其Shuffle给Reduce Task。
Yarn的应用资源模型是一个通用的设计,一个应用(通过Application Master)可以请求非常具体的资源,包括:
Yarn被设计成可以允许应用程序(通过Application Master)以共享的、安全的,以及多用户租户的方式使用集群的资源,它也会感知集群的网络拓扑,以便可以有效地调度以及优化数据网文(即尽可能地为应用减少数据移动)。
位于Resource Manager内的中心调度器保存了应用程序的资源请求信息,以帮助它为集群中的所有应用做出更优的调度决策。
本质上,一个应用程序可以通过Application Master请求特定的资源需求来满足它的资源需要。调度器会分配一个Container来响应资源需求,用于满足由Application Master在Resource Request中提出的需求。
Resource Request的形式如下:
<资源名称,优先级,资源需求,Container数>
其中:
本质上,Container是一种资源分配形式,是Resource Manager为Resource Request成功分配资源的结果。Container为应用程序授予在特定主机上使用资源(如内存、CPU等)的权利。
Application Master必须取走Container,并交给Node Manager,Node Manager会利用相应的资源来启动Container的任务进程。出于安全考虑,Container的分配要以一种安全的方式进行验证,来保证Application Master不能伪造集群中的应用。Container只有使用服务器(Node Manager)上指定资源的权利,Application Master必须想Node Manager提供更多信息来启动Container。
总之,
Job History Server,即作业历史服务。记录在Yarn中调度的作业历史运行情况情况,可以通过历史任务日志服务器来查看hadoop的历史任务,出现错误都应该第一时间来查看日志。
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 多长时间聚合删除一次日志 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>2592000</value><!--30 day-->
</property>
<!-- 时间在几秒钟内保留用户日志。只适用于如果日志聚合是禁用的 -->
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>604800</value><!-- 7 day -->
</property>
<!-- 指定文件压缩类型用于压缩汇总日志 -->
<property>
<name>yarn.nodemanager.log-aggregation.compression-type</name>
<value>gz</value>
</property>
<!-- nodemanager本地文件存储目录 -->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/bigdata/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/yarn/local</value>
</property>
<!-- resourceManager保存最大的任务完成个数 -->
<property>
<name>yarn.resourcemanager.max-completed-applications</name>
<value>1000</value>
</property>
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver
经典的MapReduce(MapReduce v1)的最顶层包含4个独立的实体,分别是客户端、JobTracker、TaskTracker,以及分布式文件系统。Yarn将JobTracker的职能划分为多个独立的实体,从而改善经典MapReduce面临的扩展瓶颈问题。JobTracker负责作业调度和任务进度监视、追踪任务、重启失败或过慢的任务及进行任务登记,例如维护计数器总数。
YARN将这两种角色划分为两个独立的守护进程:管理集群上资源使用的资源管理器(Resource Manager)和管理集群上运行任务生命周期的应用管理器(Application master)。
基本思路是:应用服务器与资源管理器协商集群的计算资源:容器(containers,每个容器都有特定的内存上限),在这些容器上运行特定应用程序的进程。容器由集群节点上运行的节点管理器(NodeManager)监视,以确保应用程序使用的资源不会超过分配给它的资源。
与jobtracker不同,应用的每个实例(一个MapReduce作业)有一个特定的应用Master,它运行在应用的存续期间。
YARN上的MapReduce比经典的MapReduce包括更多的实体,总体上,Yarn的工作流程包括5个步骤:
configuration.set("mapreduce.job.ubertask.enable", "true");
⑧若作业不以uber任务方式运行,那么appMaster会为作业中的每一个任务(map任务、reduce任务)向RM请求container
内存的分配方式不同于MapReduce1,MapReduce1中Task trackers有在集群配置时设置的固定数量的槽,每个任务在一个槽上运行。槽有最大内存分配限制,这对集群是固定的,导致当任务使用较少内存时无法充分利用内存(因为其他等待的任务不能使用这些未使用的内存)以及由于任务不能获取足够内存而导致作业失败。
在YARN中,资源分为更细的粒度,所以可以避免上述问题。
申请资源->启动appMaster->申请运行任务的container->分发Task->运行Task->Task结束->回收container