Hadoop三大核心组件:HDFS、MapReduce和YARN
一)Yarn的概念
YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率,资源统一管理和数据共享等方面带带了巨大好处。
资源管理系统:集群的硬件资源,和程序运行相关,比如:内存,CPU等。
调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
通用:不仅仅支持Mapredcue程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完了之后还给我。
可以把YARN理解为一个分布式操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需要的资源。
二)yarn架构
yarn是如何完成这些任务的呢?我们来看它的架构图。
ResourceManager(RM): YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。接收用户的作业提交,并通过NM分配,管理各个机器上的计算资源。
NodeManager(NM)。YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。根据RM命令,启动Container容器,监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
ApplicationMaster(AM)。用户提交的每个应用程序均包含一个AM。应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
ResourceManager,NodeManager 是集群物理层面的组件,ApplicationMaster(App Mstr) 是App层面的组件。 以上叫yarn的三大组件。
4台机器,两个客户端。
Client: 提交程序的一端。
Container容器:每台机器上都可能会有若干个容器,它是硬件资源的抽象。在一台机器上运行多个程序,如何保证程序之间它们相互不干扰?通过容器。一台机器上有很多的容器,有的容器大,有的容器小。
(三)核心流程
上面的流程图中,有四个核心交互流程
- MR作业提交 Client-->RM
- 资源的申请 AppMaster-->RM
- MR作业状态汇报 Container(Map|Reduce Task)-->Container(AppMaster)
- 节点的状态汇报 NM-->RM
四)整体概述
当用户向 YARN 中提交一个应用程序后, YARN将分两个阶段运行该应用程序 。
第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster;
第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。
五)MR提交YARN详细流程
第1步、用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序);
第2步、ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求
它在这个Container中启动这个应用程序的ApplicationMaster。
第3步、ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态(处理了百分之几);
第4步、AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态;
第5步、一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。
第6步、NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
第7步、各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向 ApplicationMaster 查询应用程序的当前运行状态。
第8步、应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。
(六)调度器策略
在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的群集上, 应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。
一般而言,调度是一个难题,并且没有一个“最佳”策略,为此,YARN提供了多种调度器和可配置的策略供选择。
(七)三种调度器
提供了三种调度器:
- FIFO Scheduler(先进先出调度器)
- Capacity Scheduler(容量调度器)
- Fair Scheduler(公平调度器)
Apache版本YARN默认使用Capacity Scheduler。如果需要使用其他的调度器,可以在在配置文件中去修改。具体修改的信息是:yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
(1)FIFO Scheduler 先进先出调度器
FIFO Scheduler是Hadoop1.x中JobTracker原有的调度器实现,此调度器在YARN中保留了下来。
FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的 资源信息作用于这个全局的queue。
优势: 无需配置、先到先得、易于执行
坏处: 任务的优先级不会变高,因此高优先级的作业需要等待;不适合共享集群
(2)Capacity Scheduler容量调度
Capacity Scheduler容量调度是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源, 这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
Capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
(3)Fair Scheduler公平调度器
Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
公平调度可以在多个队列间工作,允许资源共享和抢占。
如何理解公平共享
有两个用户A和B,每个用户都有自己的队列。
- A启动一个作业,由于没有B的需求,它分配了集群所有可用的资源。
- 然后B在A的作业仍在运行时启动了一个作业,经过一段时间,A,B各自作业都使用了一半的资源。
- 现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将拥有资源的四分之一,而A继续将拥有一半的资源。结果是资源在用户之间公平地共享。
(八)设置队列,并提交任务到不同的队列执行
理论介绍完了,我们来看一下提交任务到不同队列的操作步骤。
- 停止服务。 使用命令:myhadoop stop
- 进入hadoop100节点,修改配置文件hadoopcapacity-scheduler.xml(调度器),它所在的位置是:/opt/module/hadoop-3.1.3/etc/hadoopcapacity-scheduler.xml。内容修改如下:设置三个队列:default, production, test分别占用20,60,20的资源。
补充的配置如下。
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,production,test</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.test.capacity</name>
<value>20</value>
</property>
- 把配置文件同步给其他机器。 对应的命令是:
xsync /opt/module/hadoop-3.1.3/etc/hadoop - 重新启动服务。 对应的命令是: myhadoop start
- 运行wordcount任务,并手动设置提交的队列名字。
cd /opt/module/hadoop-3.1.3/share/hadoop/mapreduce # 切换目录
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapred.job.queue.name=test /cinput /out2
上面的-Dmapred.job.queue.name=test中,test就是我们指定的运行本任务的队列的名字。
队列可以被看作是任务的等待区域,就像现实生活中人们排队等待服务一样。在 Hadoop 集群中,当有多个 MapReduce 或其他类型的任务同时提交时,这些任务会被放入不同的队列中等待资源分配和执行。每个队列都有自己的属性和规则,用于控制任务的调度和资源分配。
提交任务到指定在队列中
-Dmapred.job.queue.name=yourQueueName 设置要提交的任务运行在哪个队列中。
hadoop jar xxx.jar mrDriver -Dmapred.job.queue.name=yourQueueName inputPath outputPath
hadoop jar hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapred.job.queue.name=test /wcinput /outp62
6.查看结果
打开浏览器,输入http://hadoop101:8088/cluster
如上的test, default就队列的名称。