一、Yarn信息
从Hadoop2开始,官方把资源管理单独剥离出来,主要是为了考虑后期作为一个公共的资源管理平台,任何满足规则的计算引擎都可以在它上面执行。所以Yarn可以实现Hadoop集群的资源共享,不仅仅可以跑MapReduce、还可以跑Spack、Flink
1.1、Yarn的架构
Yarn主要负责集群资源的管理和调度,支持主从架构,主节点最多可以有2个,从节点可以有多个。其中
- ResourceManager是主节点,主要负责集群资源的分配和管理
- NodeManager是从节点,主要负责当前机器资源管理
1.2、Yarn资源管理模型
Yarn主要管理内存和CPU这两种资源类型
- 当NodeManager节点启动的时候自动向ResourceManager注册,将当前节点上的可用CPU信息和内存信息注册上去
- 这样所有的NodeManager注册完成之后,ResourceManager就知道目前集群的资源总量了
http://192.168.234.100:8088/cluster/nodes
但是我们虚拟机没有分配8G的内存,为什么这边资源管理会显示8G呢?
这是yarn-default.xml有这些默认资源的配置
- yarn.nodemanager.resource.memory-mb:单节点可分配的物理内存总量,默认是8MB*1024
- yarn.nodemanager.resource.cpu-vcores:单节点可分配的虚拟CPU个数,默认是8
实际的开发中,会根据服务器的环境配置进行修改。
二、Yarn中的调度器
-
FIFO Scheduler:先进先出调度策略
大家都是排队的,如果你的任务申请不到足够的资源,那你就等着,等前面的任务执行结束释放了资源之后你再执行。这种在有些时候是不合理的,因为我们有一些任务的优先级比较高,我们希望任务提交上去立刻就开始执行,这个就实现不了了
-
Capacity Scheduler:FIFO Scheduler的多队列版本
先把集群中的整块资源划分成多份,我们可以人为的给这些资源定义使用场景,例如图里面的queue A里面运行普通的任务,
queueB中运行优先级比较高的任务。这两个队列的资源是相互对立的。但是注意一点,队列内部还是按照先进先出的规则。
-
FairSheduler:多队列,多用户共享资源
每个队列中的任务共享其所在队列的所有资源,不需要排队等待资源。具体是这样的,假设我们向一个队列中提交了一个任务,这个任务刚开始会占用整个队列的资源,当你再提交第二个任务的时候,第一个任务会把他的资源释放出来一部分给第二个任务使用
从hadoop2开始, CapacitySchedule r也 是集群中的默认调度器了。