yarn是一个资源调度平台,相当于一个分布式的操作系统平台,负责为运算程序提供服务器运算资源,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
1.Yarn基础架构
核心组件:
- ResourceManager
- NodeManager
- ApplicationMaster
- Container
ResourceManager(RM)
职责:
(1)接收Yarn客户端的请求,比如提交计算作业(MR、Spark、Flink)
(2)监控NodeManager 的资源(CPU\内存)
(3)启动和监控ApplicationMaster (AppMaster是一个进程,一个计算作业对应一个AppMaster)
(4)集群资源的分配和调度
NodeManager(NM)
职责:
(1)管理单个节点的资源
(2)处理来自RM的命令
(3)处理来自ApplicationMaster的命令
ApplicationMaster(AM)
职责:
(1)为计算程序(一个MR、Spark、flink任务)申请计算所需要的资源并且分配给内部的任务
(2)监控MapTask、ReduceTask
如果某个Task计算任务挂了,就会重新申请资源来执行task
Container
是yarn集群中资源的抽象,封装了NodeManager节点上的多种资源(内存、cpu、磁盘、网络等);
AppMaster、MapTask、ReduceTask等进程都是运行在Container中的;所以Container就是一个子任务的运行容器;
2.Yarn工作流程
在命令行中执行hadoop jar xxx 一个MR程序会走怎样的流程?
(0)MR的Driver类中,提交任务job.waitForCompletion()方法会创建一个客户端,本地模式下叫localRunner,集群模式下叫YarnRunner
(1)YarnRunner向ResourceManager申请运行一个应用程序(计算任务)
(2)RM将该应用程序(计算Job)的一些信息所要存放的路径返回给YarnRunner
(1)job的相关信息
- Job.split 切片信息;控制MapTask的个数
- job.xml job所需要的资源配置信息
- wc.jar jar包;MR程序代码
(2)job信息存放路径
如果是本地模式,那么就在本地机器上创建一个staging目录来存放
如果是集群模式,在hdfs的一个staging目录中存放
(3)YarnRunner该job运行所需的信息提交到HDFS上的指定目录中
(4)job资源提交完毕后,向RM申请运行mrAppMaster进程
(5)RM将请求初始化成一个Task,放进调度队列中,等待调度执行
(6)Task被调度的时候,其中一个NodeManager会领取到Task,紧接着该NodeManager创建容器Container,来运行MRAppmaster进程
(8)Appmaster进程会从HDFS上拷贝job的配置信息到本地节点
(9)Appmaster拿到job配置信息后,也就有了切片信息,此时AM会向RM 申请运行MapTask的资源
申请在NodeManager节点上开启task进程的请求都会被封装成Task进入ResourceManager的任务调度器中,调度执行
(10)RM会在有资源的NodeManager节点上创建容器来运行MapTask任务
如果NodeManager节点资源充足,同时分配多个container来运行MapTask也是ok的
(11)此时MapTask的容器有了,MRAppmaster会向两个接收到任务的NodeManager发送程序启动脚本,分别启动MapTask
(12) MapTask执行完毕,会在NodeManager上产生结果分区且区内有序的结果数据,一个MapTask对应一个
(13)MrAppMaster等待所有MapTask运行完毕后,再次向RM申请容器,运行ReduceTask进程
(1)这里说等待所有MapTask运行完毕后,申请运行ReduceTask是不严谨的;
Hadoop有优化机制会提前ReduceTask的执行
(2) MapTask执行完了就会销毁容器
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。
HDFS\MR\Yarn的配合
3.Yarn资源调度器
理解调度器的功能
首先要分清两个概念:任务调度和任务执行;
调度器 相当于食堂打饭阿姨,阿姨打饭是调度,吃饭是执行;
FIFO调度器就相当于食堂阿姨只能给排队的第一个人打饭;但不意味着同一时刻只能有一个任务再执行。
Hadoop作业调度器主要有三种:
- FIFO
- Capacity Scheduler
- Fair Scheduler
Apache Hadoop3.1.3默认的资源调度器是Capacity Scheduler
CDH 默认调度器是Fair Scheduler
具体设置详见:yarn-default.xml文件
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
3.1 FIFO调度器
job先进先出;必须等第一个job执行完了,才能调度第二个job分配资源来运行;
3.2 Capacity Scheduler
(1)多条FIFO队列
(2)每条队列都有资源占比分配、资源上下限
(3)队列之间可以借资源;
(4)可以针对用户限定其可用资源上限
调度算法:
Job层面的分配:
(1)队列之间,小队列中的job优先分配资源
(2)队列中,按照job优先级和提交时间顺序
Job中Task层面的分配:
3.3 公平调度器
(1)和容量调度器的共同点
(2)和容量调度器的区别
默认使用的调度算法不同,公平调度器默认用FAIR,容量调度器是FIFO;如果公平调度器改成FIFO,和容量没区别了
(3)FIFO和FAIR的宏观区别:
容量调度器优先给小队列的job分配资源,FAIR优先给缺额大的job分配资源;
公平的FAIR策略是队列中所有的job宏观上都会被分配资源
缺额的含义:
某一时刻应该获取的资源和实际获取的资源的差值;
FAIR策略理论
Fair策略演示
(1)队列之间的资源分配
(2)job之间的资源分配
DRF策略
3.4 Yarn调度器多队列配置(☆)
4.Yarn常用命令
为了方便演示,先启动一个wc程序
1.yarn application查看任务
(1)查看所有在yarn集群上正在运行的任务
yarn application -list
如果任务结束了,就看不到了
(2)查看所处状态的任务
yarn application - list -appStates FINISHED
状态有:
FINISHED
ALL
NEW
NEW_SAVING
SUBMITTED
ACCEPTED
RUNNING
FINISHED
FAILED
KILLED
(3) kill application
yarn application -kill [application-id]
2.yarn logs 查看日志
(1) 查看Application日志 [重要]
yarn logs -applicationId [application-id]
如果yarn ui页面或者没有配置历史服务器,就可以通过这个命令查看
(2) 查看一个container中任务的执行日志
yarn los -applicationId [application-id] -containerId [containerid]
3.yarn applicationattempt 查看尝试运行的任务
尝试:任务正在运行时候,处于什么状态
(1) 这个可以查看到容器ID
yarn applicationattempt -list [application-id]
(2) 查看任务状态
4.yarn container 查看容器
5.yarn node 查看节点状态
6.yarn rmadmin 更新任务配置
这个命令很重要,如果我们修改了yarn的队列配置,不需要重启yarn,直接执行这个命令,yarn就能重新读取配置文件;
注意,只和队列配置有关;
7.yarn queue 查看队列状态
5.yarn生产环境核心配置参数
1.ResourceManager相关配置
yarn.resourcemanager.scheduler.class
- 功能:配置调度器种类;
- apache默认是fifo,cdh默认是fair
yarn.resourcemanager.scheduler.thread-count
- resourcemanager能够接受的客户端线程;
- 默认50个
2.NodeManager相关
yarn.nodemanager.resource.detect-hardware-capabilities
- 是否让yarn自己检测硬件配置,默认false;
- 一般手动配置NM
yarn.nodemanager.resource.count-logical-processors-as-cores
- 是否将虚拟核数当作CPU核数,默认false;
- 如果NM之间的配置不同,有的配置高,有的配置低,纯按照物理核,性能好的浪费资源,所以此时开启这个配置
yarn.nodemanager.resource.pcores-vcores-multiplier
- 此配置项依赖上面一个
- 虚拟核能顶多少个核物理核,该参数应设置为2,默认1
yarn.nodemanager.resource.memory-mb
- NodeManager节点上缴给yarn可用的内存;默认8G
yarn.nodemanager.resource.system-reserved-memory-mb
- Nodemanager为系统保留多少内存;
- 这个参数和上面一个参数是相反的,因此二者只配置一个即可
yarn.nodemanager.resource.cpu-vcores
- Nodemanager上缴给yarn的cpu核数;默认8个
yarn.nodemanager.pmem-check-enabled
- 是否开启物理内存检查限制,默认打开;
- 检查NM内存使用情况,如果不加控制,可能会占用系统内存,导致机器崩溃;
yarn.nodemanager.vmene-check-enabled
- 是否开启虚拟内存检查限制,默认打开;
yarn.nodemanager.vmem-pmem-ratio
- 虚拟内存和物理内存比例;默认2:1
3.Container相关
yarn.scheduler.minimum-allocation-mb
- 容器最小内存,默认1g
yarn.scheduler.maxmum-allocation-mb
- 容器最大内存,默认8g;不能超过NM上缴的内存
yarn.scheduler.minimum-allocation-vcores
- 容器最小cpu核数,默认1个
yarn.scheduler.minimum-allocation-mb
- 容器最大cpu核数,默认4个;不能超过NM上缴的CPU核数
4. AppMaster进程相关
4.1 增加ApplicationMaster资源比例
针对容量调度器并发度低的问题,考虑调整yarn.scheduler.capacity.maximum-am-resource-percent
该参数。
默认值是0.1,表示集群上AM最多可使用的资源比例,目的为限制过多的app数量。
(1)在hadoop102的/opt/module/hadoop-3.1.3/etc/Hadoop/capacity-scheduler.xml文件中修改如下参数值
[atguigu@hadoop102 hadoop]$ vim capacity-scheduler.xml
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.5</value>
<description>
集群中用于运行应用程序ApplicationMaster的资源比例上限,
该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,
默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数
yarn.scheduler.capacity.maximum-am-resource-percent设置,而单个队列可通过参数yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent设置适合自己的值。
</description>
</property>
(2)分发capacity-scheduler.xml配置文件
[atguigu@hadoop102 hadoop]$ xsync capacity-scheduler.xml
(3)关闭正在运行的任务,重新启动yarn集群
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh