2.9-Yarn
什么是Yarn?
从Hadoop2开始,官方把资源管理单独剥离出来,主要是为了考虑后期作为一个公共的资源管理平台,任何满足规则的计算引擎都可以在它上面执行。所以YARN可以实现HADOOP集群的资源共享,不仅仅可以跑MapRedcue,还可以跑Spark、Flink。
Yarn架构分析
ResourceManager:是主节点,主要负责集群资源的分配和管理NodeManager:是从节点,主要负责当前机器资源管理
Yarn资源管理模型
YARN主要管理内存和CPU这两种资源类型
当NodeManager节点启动的时候自动向ResourceManager注册,将当前节点上的可用CPU信息和内存 信息注册上去。
集群内存:24GB
集群CPU 16Cores
活跃从节点3个,其中主节点是主从一体节点
这里显示的节点参数是
- yarn.nodemanager.resource.memory-mb:单节点可分配的物理内存总量,默认是8MB*1024, 即8G
- yarn.nodemanager.resource.cpu-vcores:单节点可分配的虚拟CPU个数,默认是8
就算你机器没有,读取默认的也会读取到这个值,属于虚标。
Yarn资源调度
集群资源是有限的,所以需要用资源调度器来进行合理分配。
资源调度器分为三种
- FIFO Scheduler:先进先出
- Capacity Scheduler:先进先出的多队列版本,队列内部先进先出
- FairScheduler:多队列,多用户共享资源
- FIFO Scheduler:是先进先出的,大家都是排队的,如果你的任务申请不到足够的资源,那你就等 着,等前面的任务执行结束释放了资源之后你再执行。这种在有些时候是不合理的,因为我们有一些 任务的优先级比较高,我们希望任务提交上去立刻就开始执行,这个就实现不了了。
- CapacityScheduler:它是FifoScheduler的多队列版本,就是我们先把集群中的整块资源划分成多 份,我们可以人为的给这些资源定义使用场景,例如图里面的queue A里面运行普通的任务, queueB中运行优先级比较高的任务。这两个队列的资源是相互对立的 但是注意一点,队列内部还是按照先进先出的规则。
- FairScheduler:支持多个队列,每个队列可以配置一定的资源,每个队列中的任务共享其所在队列 的所有资源,不需要排队等待资源 具体是这样的,假设我们向一个队列中提交了一个任务,这个任务刚开始会占用整个队列的资源,当 你再提交第二个任务的时候,第一个任务会把他的资源释放出来一部分给第二个任务使用
实际工作中,我们一般使用第二种资源调度器
实战:Yarn配置多资源队列
我们增加2个队列,一个是online队列,一个是offline队列
online队列里面运行实时任务
offline队列里面运行离线任务
具体步骤如下:
修改集群中 etc/hadoop 目录下的 capacity-scheduler.xml 配置文件
修改和增加以下参数,针对已有的参数,修改value中的值,针对没有的参数,则直接增加
这里的 default 是需要保留的,增加 online,offline ,这三个队列的资源比例为 7:1:2
具体的比例需要根据实际的业务需求来,看你们那些类型的任务比较多,对应的队列中资源比例就调高一
些,我们现在暂时还没有online任务,所以我就把online队列的资源占比设置的小一些。
先修改bigdata01上的配置
1:指定多队列
<property> <name>yarn.scheduler.capacity.root.queues</name> <value>default,online,offline</value> <description>队列列表</description> </property>
2.指定默认队列资源70%
<property> <name> yarn.scheduler.capacity.root.default.capacity </name> <value>70</value> <description>default队列70%</description> </property>
3.另外两个队列的资源
<property> <name>yarn.scheduler.capacity.root.online.capacity</name> <value>10</value> </property> <property> <name>yarn.scheduler.capacity.root.offline.capacity</name> <value>20</value> </property>
4.资源上线
<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> </property> <property> <name>yarn.scheduler.capacity.root.offline.maximum-capacity</name> <value>20</value> </property>
分别拷贝到2号机和3号机
scp -rq capacity-scheduler.xml bigdata02:/data/soft/hadoop-3.2.0/etc/hadoop/ scp -rq capacity-scheduler.xml bigdata03:/data/soft/hadoop-3.2.0/etc/hadoop/
重启集群生效配置
针对资源调度的看法
- FIFO Scheduler:仅做了解弃用
- Capacity Scheduler:容量调度器尝试用在集群节点100台+以上
- Fair Scheduler:节点台数<100优选,资源灵活配置
针对Fair Scheduler:
假设有两个用户 A 和 B,分别拥有一个自己的队列 Queue A 和 Queue B。当 A 启动一个 job1 而 B 没有提交任务时,A 会获得集群的全部资源(Queue A + Queue B);当 A 的 job1 仍在运行,且 B 启动第一个 job2 时,Queue A 会逐渐释放一半资源,两个任务会各自占用集群的一半资源。如果此时 B 再启动第二个 job3 并且其它 job 仍在运行时,则它将会和 B 的第一个 job2 共享队列 B 的资源,也就是 Queue B 的两个 job 将会分别占用集群的四分之一资源,而 A 的 job1 仍然占用集群的一半资源。
此时,这个过程中,job1 和 job2 分别占用集群的一半资源,后来由于 job3 的加入,job2 和 job3 平分 Queue B 的资源。最终结果就是集群的资源在两个用户之间实现了公平共享。
参考案例:
生产级实践:Oozie Launcher优化,配合Yarn资源调度模式能够更好地理解
https://support.huaweicloud.com/trouble-mrs/mrs_03_0302.html
https://blog.csdn.net/bigdataprimary/article/details/84314377
https://blog.csdn.net/godlovedaniel/article/details/106094675
https://blog.51cto.com/u_15278282/5154702
https://blog.csdn.net/weixin_30016961/article/details/112092823?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242
2.10-官方文档使用
官网截图先来一张。
三步使用法:
1.下载
2.开始
3.阅读文档
Download没什么好说的,下载好部署即可
Getting Started
主要包含了一些分布式配置信息和伪分布式配置信息等等
Documentation
主要是Hadoop一些核心操作的文档等