大数据开发工程师-第六周 第三章 YARN实战


第六周 第三章 YARN实战

HADOOP之YARN详解

1
前面我们学习了Hadoop中的MapReduce,我们知道MapReduce任务是需要在YARN中执行的,那下面我们就来学习一下Hadoop中的YARN

YARN的由来

1
2
从Hadoop2开始,官方把资源管理单独剥离出来,主要是为了考虑后期作为一个公共的资源管理平台,任何满足规则的计算引擎都可以在它上面执行。
所以YARN可以实现HADOOP集群的资源共享,不仅仅可以跑MapRedcue,还可以跑Spark、Flink。

YARN架构分析

1
2
3
4
咱们之前部署Hadoop集群的时候也对YARN的架构有了基本的了解
YARN主要负责集群资源的管理和调度,支持主从架构,主节点最多可以有2个,从节点可以有多个
其中:ResourceManager:是主节点,主要负责集群资源的分配和管理
NodeManager:是从节点,主要负责当前机器资源管理

YARN资源管理模型

1
2
3
4
5
6
YARN主要管理内存和CPU这两种资源类型
当NodeManager节点启动的时候自动向ResourceManager注册,将当前节点上的可用CPU信息和内存信息注册上去。
这样所有的nodemanager注册完成以后,resourcemanager就知道目前集群的资源总量了。
那我们现在来看一下我这个一主两从的集群资源是什么样子的,打开yarn的8088界面

注意,这里面显示的资源是集群中所有从节点的资源总和,不包括主节点的资源,

H2ELY6.md.png

image-20230316155158756

1
那我们再详细看一下每一个从节点的资源信息

H21Xsx.md.png

image-20230316160838630

image-20230316162520890

1
2
3
但是这个数值是对不上的,我的linux机器每台只给它分配了2G的内存  通过free -m可以看到

CPU只分配了1个 通过top命令可以看到

image-20230316162601856

1
2
3
4
5
6
7
那为什么在这里显示是内存是8G,CPU是8个呢?
不要着急,我们先喝杯咖啡,看一下下面这2个参数

yarn.nodemanager.resource.memory-mb:单节点可分配的物理内存总量,默认是8MB*1024,即8G
yarn.nodemanager.resource.cpu-vcores:单节点可分配的虚拟CPU个数,默认是8

看到没有,这都是默认单节点的内存和CPU信息,就算你这个机器没有这么多资源,但是在yarn-default.xml中有这些默认资源的配置,这样当nodemanager去上报资源的时候就会读取这两个参数的值,这也就是为什么我们在前面看到了单节点都是8G内存和8个cpu,其实我们的linux机器是没有这么大资源的,那你这就是虚标啊,肯定不能这样干,你实际有多少就是多少,所以我们可以修改这些参数的值,修改的话就在yarn-site.xml中进行配置即可,改完之后就可以看到真实的信息了,在这我就先不改了,针对我们的学习环境不影响使用,修改的意义不大,你知道这回事就行了。

YARN中的调度器(面试中经常问)

1
2
3
4
5
6
7
8
9
10
11
12
13
接下来我们来详细分析一下YARN中的调度器,这个是非常实用的东西,面试的时候也会经常问到。
大家可以想象一个场景,我们集群的资源是有限的,在实际工作中会有很多人向集群中提交任务,那这时候资源如何分配呢?
如果你提交了一个很占资源的任务,这一个任务就把集群中90%的资源都占用了,后面别人再提交任务,剩下的资源就不够用了,这个时候怎么办?

让他们等你的任务执行完了再执行?还是说你把你的资源匀出来一些分给他,你少占用一些,让他也能慢慢的开始执行?
[root@bigdata02 ~]# free -m
total used free shared buff/cache availab
Mem: 1819 372 1133 9 313 12
Swap: 2047 0 2047
1234
top - 11:30:35 up 1:05, 1 user, load average: 0.00, 0.08, 0.10
Tasks: 99 total, 1 running, 98 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si
1
2
3
4
5
6
7
具体如何去做这个是由YARN中的调度器负责的
YARN中支持三种调度器
1:FIFO Scheduler:先进先出(first in, first out)调度策略
2:Capacity Scheduler:FIFO Scheduler的多队列版本
3:FairScheduler:多队列,多用户共享资源

下面来看图分析一下这三种调度器的特性

H2dj9f.md.png

1
2
3
4
5
FIFO Scheduler:是先进先出的,大家都是排队的,如果你的任务申请不到足够的资源,那你就等着,等前面的任务执行结束释放了资源之后你再执行。这种在有些时候是不合理的,因为我们有一些任务的优先级比较高,我们希望任务提交上去立刻就开始执行,这个就实现不了了。
CapacityScheduler:它是FifoScheduler的多队列版本,就是我们先把集群中的整块资源划分成多份,我们可以人为的给这些资源定义使用场景,例如图里面的queue A里面运行普通的任务,queueB中运行优先级比较高的任务。这两个队列的资源是相互对立的
但是注意一点,队列内部还是按照先进先出的规则。
FairScheduler:支持多个队列,每个队列可以配置一定的资源,每个队列中的任务共享其所在队列的所有资源,不需要排队等待资源
具体是这样的,假设我们向一个队列中提交了一个任务,这个任务刚开始会占用整个队列的资源,当你再提交第二个任务的时候,第一个任务会把他的资源释放出来一部分给第二个任务使用
1
2
在实际工作中我们一般都是使用第二种,CapacityScheduler,从hadoop2开始,Capacity Scheduler也是集群中的默认调度器了
那下面我们到集群上看一下,点击左侧的Scheduler查看

H2y4IJ.md.png

1
2
Capacity,这个是集群的调度器类型,
下面的root是根的意思,他下面目前只有一个队列,叫default,我们之前提交的任务都会进入到这个队列中。

案例:YARN多资源队列配置和使用

配置

1
下面我们来修改一下,增加多个队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  我们的需求是这样的,希望增加2个队列,一个是online队列,一个是offline队列
然后向offline队列中提交一个mapreduce任务
online队列里面运行实时任务,offline队列里面运行离线任务,我们现在学习的mapreduce就属于离线任务
实时任务我们后面会学习,等讲到了再具体分析。

这两个队列其实也是我们公司中最开始分配的队列,不过随着后期集群规模的扩大和业务需求的增加,后期又增加了多个队列。
在这里我们先增加这2个队列,后期再增加多个也是一样的。

具体步骤如下:
修改集群中etc/hadoop目录下的capacity-scheduler.xml配置文件
修改和增加以下参数,针对已有的参数,修改value中的值,针对没有的参数,则直接增加
这里的default是需要保留的,增加online,offline,这三个队列的资源比例为 7:1:2

具体的比例需要根据实际的业务需求来,看你们那些类型的任务比较多,对应的队列中资源比例就调高一些,我们现在暂时还没有online任务,所以我就把online队列的资源占比设置的小一些。
先修改bigdata01上的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,online,offline</value>
<description>队列列表,多个队列之间使用逗号分割</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>70</value>
<description>default队列70%</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.online.capacity</name>
<value>10</value>
<description>online队列10%</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.offline.capacity</name>
<value>20</value>
<description>offline队列20%</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>70</value>
<description>Default队列可使用的资源上限.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.online.maximum-capacity</name>
<value>10</value>
<description>online队列可使用的资源上限.</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.offline.maximum-capacity</name>
<value>20</value>
<description>offline队列可使用的资源上限.</description>
</property>
1
资源上限可以基于上面设置的比例上调,如default的上限设置成80,则它去抢占其它队列的资源
1
2
3
4
5
6
7
修改好以后再同步到另外两个节点上
scp -rq capacity-scheduler.xml bigdata02:/data/soft/
scp -rq capacity-scheduler.xml bigdata03:/data/soft/

然后重启集群才能生效

进入yarn的web界面,查看最新的调度器队列信息

HWPnTx.md.png
HWPKk6.md.png

使用

1
2
3
4
注意了,现在默认提交的任务还是会进入default的队列,如果希望向offline队列提交任务的话,需要指定队列名称,不指定就进默认的队列
在这里我们还需要同步微调一下代码,否则我们指定的队列信息代码是无法识别的
拷贝WordCountJob类,新的类名为WordCountJobQueue
主要在job配置中增加一行代码
代码的改变
1
2
在最初的wordcount案例代码基础上
**主要改写job部分**
1
2
3
4
5
6
7
8
9
10
11
12
13
// 指定Job需要的配置参数
Configuration conf = new Configuration();
// (调度器)解析命令行中通过-D传递过来的参数,添加到conf中
String[] remainingArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); // 改变的地方
// 创建一个Job
Job job = Job.getInstance(conf);
// 注意:这一行必须设置,否者在集群中执行时找不到WordCountJob这个类
job.setJarByClass(WordCountJobSkew.class);

// 指定输入路径,可以是文件也可以是目录(目录里只有一个文件时可以); 注意FileInputFormat别选成hadoop1.x的了
FileInputFormat.setInputPaths(job, new Path(remainingArgs[0])); // 改变的地方
// 指定输出路径(只能是hdfs上一个不存在的目录); 注意FileOutFormat别选成hadoop1.x的了
FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1])); // 改变的地方
1
如果真正理解了的话可以直接在代码里写,不用通过命令传

打包,上传,执行

1
hadoop jar bigdata_hadoop-1.0-SNAPSHOT-jar-with-dependencies.jar com.imooc.mc.WordCountJobQueue -Dmapreduce.job.queuename=offline  /test/WordCount/test/test.txt /test/WordCount/test/outcomeScheduler

image-20230316171323428

1
2
3
 如果我们去掉指定队列名称的配置(命令中,代码不用改),此时还会使用default队列

这就是YARN中调度器多资源队列的配置,在工作中我们只要掌握如何使用这些队列就可以了,具体如何配置是我们向运维同学提需求,他们去配置。

本文标题:大数据开发工程师-第六周 第三章 YARN实战

文章作者:TTYONG

发布时间:2022年02月13日 - 14:02

最后更新:2023年07月04日 - 10:07

原始链接:http://tianyong.fun/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88-%E7%AC%AC%E5%85%AD%E5%91%A8-%E7%AC%AC%E4%B8%89%E7%AB%A0-YARN%E5%AE%9E%E6%88%98.html

许可协议: 转载请保留原文链接及作者。

多少都是爱
0%