[ hadoop] Yarn架构

Yarn概述

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

基础架构

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

[ hadoop] Yarn架构_第1张图片

ResourceManager:整个集群资源的老大

NodeManager:单节点资源的老大

ApplicationMaster:单个作业任务的老大

Container:容器

Yarn工作机制

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

[ hadoop] Yarn架构_第2张图片

  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/先进先出调度器:顾名思义,单队列,根据作业提交先后顺序,先来先服务,可连续提交任务,直到新提交的任务申请不到资源为止.

[ hadoop] Yarn架构_第3张图片

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

容量调度器

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

[ hadoop] Yarn架构_第4张图片

特点

  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. 总结就是:有资源大家先均分,然后按额定好的多退少补

[ hadoop] Yarn架构_第5张图片

与容量调度器相同点 不同点
多队列 核心调度策略(资源利用率 / 缺额比例)
队列容量保证(上下限) 单队列资源分配方式(FIFO,DRF / FIFO,FAIR,DRF)
灵活性(借调和归还)
多租户(共享集群和多job并行,限定单用户最大占用资源)

缺额

[ hadoop] Yarn架构_第6张图片

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

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

队列资源分配方式

  1. FIFO策略:如果使用FIFO策略,此时公平调度器就成为容量调度器

  2. FAIR策略:

    从选择队列–>选择作业–>选择容器

    每一步都按照公平策略分配资源[如下图]

    [ hadoop] Yarn架构_第7张图片

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

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

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

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

资源分配算法

  1. 队列资源分配(多退少补):

    [ hadoop] Yarn架构_第8张图片

  2. 作业资源分配:

    [ hadoop] Yarn架构_第9张图片

  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 优先级

你可能感兴趣的:(hadoop,hadoop,架构,big,data)