Yarn概述

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。

基础架构

YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

yarn 构建 yarn基本架构_资源分配

ResourceManager:整个集群资源的老大

NodeManager:单节点资源的老大

ApplicationMaster:单个作业任务的老大

Container:容器

Yarn工作机制

以下流程以2个切片,两个分区为例(4大步,14小步):

yarn 构建 yarn基本架构_big data_02

  1. 客户端所在节点执行Jar包中的程序(MR程序),执行驱动类中main方法末尾的waitForCompletion()底层创建YarnRunner,正式运行Yarn;
  2. YarnRunner向ResourceManager申请一个Application
  3. RM返回给YarnRunner该job资源的提交路径和作业id
  4. 驱动类中的程序底层job.submit()将资源(三个文件:切片,配置,程序Jar包)提交到集群,为第8步做准备
  5. 资源提交完毕,向RM申请运行mrAppMaster | 1-5为作业提交
  6. RM将用户的请求初始化成一个job,添加到容量调度器中.
  7. 一个NodeManager领取job后创建容器Container,并产生MRAppmaster
  8. Container从HDFS上拷贝资源到本地 | 6-8为作业初始化
  9. MRAppmaster向RM申请运行MapTask资源
  10. RM将MapTask任务分给另两个NodeManager,这两个NodeManager分别领取任务并创建容器 | 9-10为任务分配
  11. MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序
  12. MrAppMaster等待所有MapTask运行完毕后(也可修改ReduceTask运行时机),向RM申请容器,运行ReduceTask。
  13. ReduceTask向MapTask获取相应分区的数据。
  14. 程序运行完毕后,MR会向RM申请注销自己。| 11-14为任务运行

收尾:

  • 此外,AppMaster负责收集Yarn中任务进度和状态(也有容器的),反馈给客户端
  • 客户端本身也能通过程序的waitForCompletion()检查作业是否完成
  • 作业完成后,APPMaster和容器将被清理和释放
  • 历史服务器将保留作业信息以备核查

Yarn调度器

  1. Hadoop作业调度器目前主要三种:FIFO,容量(Capacity Scheduler),和公平(Fair Scheduler)
  2. Apache Hadoop3.1.3(本例)默认是容量调度器
  3. CDH框架默认是公平调度器

FIFO

FIFO调度器/First In First Out/先进先出调度器:顾名思义,单队列,根据作业提交先后顺序,先来先服务,可连续提交任务,直到新提交的任务申请不到资源为止.

yarn 构建 yarn基本架构_yarn 构建_03

由于该调度器不支持多队列,生产环境很少使用,但其FIFO调度策略可使用于一个队列

容量调度器

Capacity Scheduler是Yahoo开发的多用户调度器

yarn 构建 yarn基本架构_yarn 构建_04

特点

  1. 可为每个队列配置一定资源量,每个队列采用FIFO调度策略
  2. 管理员可设置每个队列的资源使用下限和上限
  3. 灵活:队列的空闲资源可借用给紧缺的队列,但job提交后回收借调的资源
  4. 多用户:
    支持多用户共享集群和多job同时运行
    该调度器对同一用户提交的job所占资源进行限定,防止一个人的job独占队列的资源

资源 分配算法

  1. 队列间资源分配:
    使用深度优先算法,为资源占用率最低的队列优先分配资源
  2. 作业间资源分配(同一队列):
    先按优先级大小后按提交时间先后
  3. 容器间 资源分配:
    job拿到资源,先按容器的优先级;
    相同之后,使用数据本地性原则:
    1)数据在任务的节点本地
    2)数据在任务节点的机架
    3)无所谓了

总结:

  1. 队列间并行运行
  2. 一个队列里按job优先级和job提交先后
  3. 队列占集群总资源有上限,同一用户提交的job占用也有上限

公平调度器

Fair Schedulere是Facebook开发的多用户调度器

该调度器分配原则:

  1. 公平
  2. 公平
  3. 还是tnd公平
  4. 总结就是:有资源大家先均分,然后按额定好的多退少补

yarn 构建 yarn基本架构_架构_05

与容量调度器相同点

不同点

多队列

核心调度策略(资源利用率 / 缺额比例)

队列容量保证(上下限)

单队列资源分配方式(FIFO,DRF / FIFO,FAIR,DRF)

灵活性(借调和归还)

多租户(共享集群和多job并行,限定单用户最大占用资源)

缺额

yarn 构建 yarn基本架构_资源分配_06

缺额:某一时刻一个作业应获资源和实际得到的差距

公平调度器就是以弥补这一缺额为目标,因此,调度器优先为缺额大的job分配

队列资源分配方式

  1. FIFO策略:如果使用FIFO策略,此时公平调度器就成为容量调度器
  2. FAIR策略:
    从选择队列–>选择作业–>选择容器
    每一步都按照公平策略分配资源[如下图]

1)实际最小资源份额:mindshare = Min(资源需求量,配置的最小资源)

2)是否饥饿:isNeedy = 资源使用量 < mindshare(实际最小资源份额)

3)资源分配比:minShareRatio = 资源使用量 / Max(mindshare, 1)

4)资源使用权重比:useToWeightRatio = 资源使用量 / 权重

资源分配算法

  1. 队列资源分配(多退少补):
  2. 作业资源分配:
  3. 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 >

打印队列信息

结合生产环境

根据生产环境下并发度选择调度器:公平/容量

容量调度器多队列

  1. 按照框架/模块创建队列
  2. 多队列好处:
    防止菜鸟提交死龟job,耗尽集群资源
    实现任务的降级使用,特殊时期保证重要的任务队列资源充足
  3. 默认的任务提交都是提交到default队列的
  4. -D mapreduce.job.queuename=队列名,向其他队列提交任务,如果程序不允许添加此参数,1:在Driver类中设置;2:使用Tool接口
  5. 单队列资源紧张时,优先级高的任务将优先获取资源
  6. 提交时使用参数设置job优先级:-D mapreduce.job.priority=5
    或者修改正在执行的任务的优先级:
    yarn application -appID < ApplicationID > -updatePriority 优先级