Yarn概述
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
基础架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。
ResourceManager:整个集群资源的老大
NodeManager:单节点资源的老大
ApplicationMaster:单个作业任务的老大
Container:容器
Yarn工作机制
以下流程以2个切片,两个分区为例(4大步,14小步):
- 客户端所在节点执行Jar包中的程序(MR程序),执行驱动类中main方法末尾的waitForCompletion()底层创建YarnRunner,正式运行Yarn;
- YarnRunner向ResourceManager申请一个Application
- RM返回给YarnRunner该job资源的提交路径和作业id
- 驱动类中的程序底层job.submit()将资源(三个文件:切片,配置,程序Jar包)提交到集群,为第8步做准备
- 资源提交完毕,向RM申请运行mrAppMaster | 1-5为作业提交
- RM将用户的请求初始化成一个job,添加到容量调度器中.
- 一个NodeManager领取job后创建容器Container,并产生MRAppmaster
- Container从HDFS上拷贝资源到本地 | 6-8为作业初始化
- MRAppmaster向RM申请运行MapTask资源
- RM将MapTask任务分给另两个NodeManager,这两个NodeManager分别领取任务并创建容器 | 9-10为任务分配
- MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序
- MrAppMaster等待所有MapTask运行完毕后(也可修改ReduceTask运行时机),向RM申请容器,运行ReduceTask。
- ReduceTask向MapTask获取相应分区的数据。
- 程序运行完毕后,MR会向RM申请注销自己。| 11-14为任务运行
收尾:
- 此外,AppMaster负责收集Yarn中任务进度和状态(也有容器的),反馈给客户端
- 客户端本身也能通过程序的waitForCompletion()检查作业是否完成
- 作业完成后,APPMaster和容器将被清理和释放
- 历史服务器将保留作业信息以备核查
Yarn调度器
- Hadoop作业调度器目前主要三种:FIFO,容量(Capacity Scheduler),和公平(Fair Scheduler)
- Apache Hadoop3.1.3(本例)默认是容量调度器
- CDH框架默认是公平调度器
FIFO
FIFO调度器/First In First Out/先进先出调度器:顾名思义,单队列,根据作业提交先后顺序,先来先服务,可连续提交任务,直到新提交的任务申请不到资源为止.
由于该调度器不支持多队列,生产环境很少使用,但其FIFO调度策略可使用于一个队列
容量调度器
Capacity Scheduler是Yahoo开发的多用户调度器
特点
- 可为每个队列配置一定资源量,每个队列采用FIFO调度策略
- 管理员可设置每个队列的资源使用下限和上限
- 灵活:队列的空闲资源可借用给紧缺的队列,但job提交后回收借调的资源
- 多用户:
支持多用户共享集群和多job同时运行
该调度器对同一用户提交的job所占资源进行限定,防止一个人的job独占队列的资源
资源 分配算法
- 队列间资源分配:
使用深度优先算法,为资源占用率最低的队列优先分配资源 - 作业间资源分配(同一队列):
先按优先级大小后按提交时间先后 - 容器间 资源分配:
job拿到资源,先按容器的优先级;
相同之后,使用数据本地性原则:
1)数据在任务的节点本地
2)数据在任务节点的机架
3)无所谓了
总结:
- 队列间并行运行
- 一个队列里按job优先级和job提交先后
- 队列占集群总资源有上限,同一用户提交的job占用也有上限
公平调度器
Fair Schedulere是Facebook开发的多用户调度器
该调度器分配原则:
- 公平
- 公平
- 还是tnd公平
- 总结就是:有资源大家先均分,然后按额定好的多退少补
与容量调度器相同点 | 不同点 |
多队列 | 核心调度策略(资源利用率 / 缺额比例) |
队列容量保证(上下限) | 单队列资源分配方式(FIFO,DRF / FIFO,FAIR,DRF) |
灵活性(借调和归还) | |
多租户(共享集群和多job并行,限定单用户最大占用资源) |
缺额
缺额:某一时刻一个作业应获资源和实际得到的差距
公平调度器就是以弥补这一缺额为目标,因此,调度器优先为缺额大的job分配
队列资源分配方式
- FIFO策略:如果使用FIFO策略,此时公平调度器就成为容量调度器
- FAIR策略:
从选择队列–>选择作业–>选择容器
每一步都按照公平策略分配资源[如下图]
1)实际最小资源份额:mindshare = Min(资源需求量,配置的最小资源)
2)是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)
3)资源分配比:minShareRatio = 资源使用量 / Max(mindshare, 1)
4)资源使用权重比:useToWeightRatio = 资源使用量 / 权重
资源分配算法
- 队列资源分配(多退少补):
- 作业资源分配:
- DRF策略
以上分配只考虑内存,DRF则考虑了多种资源,包括:内存,CPU,网络带宽等
Yarn常用命令
命令 | 功能 |
yarn application -list | 列出所有Application |
yarn application -list -appStates | 根据Application状态过滤 |
yarn application -kill < ApplicationId > | Kill掉Application |
yarn logs -applicationId < ApplicationId > | 查询Application日志 |
yarn logs -applicationId < ApplicationId > -containerId < ContainerId > | 查询Container日志 |
yarn applicationattempt -list < ApplicationId > | 查看尝试运行的任务(排查) |
yarn applicationattempt -status < ApplicationAttemptId > | 打印ApplicationAttemp状态 |
yarn container -list < ApplicationAttemptId > | 列出所有Container |
yarn container -status < ContainerId > | 打印Container状态(任务跑的途中才能看到) |
yarn node -list -all | 列出所有节点 |
yarn rmadmin -refreshQueues | 加载队列配置(动态修改) |
yarn queue -status < QueueName > | 打印队列信息 |
结合生产环境
根据生产环境下并发度选择调度器:公平/容量
容量调度器多队列
- 按照框架/模块创建队列
- 多队列好处:
防止菜鸟提交死龟job,耗尽集群资源
实现任务的降级使用,特殊时期保证重要的任务队列资源充足 - 默认的任务提交都是提交到default队列的
- -D mapreduce.job.queuename=队列名,向其他队列提交任务,如果程序不允许添加此参数,1:在Driver类中设置;2:使用Tool接口
- 单队列资源紧张时,优先级高的任务将优先获取资源
- 提交时使用参数设置job优先级:-D mapreduce.job.priority=5
或者修改正在执行的任务的优先级:
yarn application -appID < ApplicationID > -updatePriority 优先级