Yarn知识点整理

Yarn知识点整理

Yarn是一个资源调度平台,负责为计算框架提供服务器运算资源,相当于一个分布式操作系统平台,而MapReduce相当于应用程序。Yarn在Hadoop2之后引入MapReduce.

基本架构

  • ResourceManager:
    • 处理客户端请求
    • 监控NodeManager状态
    • 启动和监控ApplicationManager
    • 资源的分配与调度
  • NodeManager:
    • 管理单个节点上的资源
    • 处理来自ResourceManager的命令
    • 处理来自ApplicationManager的命令
  • ApplicationManager:
    • 负责数据切分
    • 为应用程序申请资源并分配给内部的任务
    • 任务的监控与容错
  • Container:
    • Yarn资源的抽象,封装了节点的多维度资源,如内存、CPU、磁盘、网络等

工作机制

Yarn知识点整理

  1. Mr程序提交到MapReduce客户端所在节点
  2. MapReduce客户端的YarnRunner类向ResourceManager申请一个Application
  3. ResourceManager将Mr程序的资源路径返回给YarnRunner
  4. MapReduce客户端将运行Mr程序所需资源提交到HDFS
  5. 程序资源提交完毕后,MapReduce客户端向ResourceManager申请运行MRAppMaster
  6. ResourceManager将客户端的请求放入调度队列,根据规定的调度算法调度任务
  7. 当该作业被调度器调度执行,某个NodeManager领取到该作业
  8. 该NodeManager在本地创建Container,并创建MRAppMaster
  9. 该Container从HDFS上拷贝运行Task所需要的job信息
  10. MRAppMaster向ResourceManager申请MapTask资源
  11. ResourceManager将MapTask分配给另外的若干个NodeManager,这些NodeManager领取任务并创建Container
  12. MRAppMaster向接收到MapTask的NodeManager发送程序启动脚本,这些NodeManager从指定的HDFS路径读取数据,执行MapTask
  13. MRAppMaster等待所有MapTask运行到一定的进度后,向ResourceManager申请资源,运行ReduceTask
  14. ResourceManager将ReduceTask分配给另外的若干个NodeManager,这些NodeManager领取任务并创建Container,并从所有MapTask获得自己的数据分区
  15. ReduceTask运行完毕后,将结果写入HDFS; 整个程序运行完毕后,MRAppMaster会向ResourceManager申请注销自己

资源调度器

Hadoop支持3种资源调度器:FIFO, Capacity Scheduler(容量调度器), Fair Scheduler(公平调度器). Hadoop 2.7.2默认的资源调度器是Capacity Scheduler(见配置文件yarn-default.xml

FIFO Scheduler

所有提交的作业按提交时间顺序排成一个先进先出的队列,每次给队首的作业分配所有集群资源,待该任务运行完成后出队,运行下一个队首任务。该调度器的缺点是大作业会阻塞小作业。

Capacity Scheduler

默认的调度器。多个FIFO队列,每个队列分得不同份额的集群资源(例如3个队列,每个队列的资源份额分别为20%, 30%, 50%)。这样可以控制作业的最大资源占用,一个任务不至于占用所有的集群资源;可以配置小份额队列,供小任务使用;不同队列的任务可以在集群中并发执行。

Fair Scheduler

支持多队列多用户,每个队列中的资源份额可以配置,同一个队列中根据作业动态调整资源,支持抢占功能。在同一个队列中,按照作业优先级分配资源,优先级越高的作业分配资源越多,但是每个作业都会分配到资源以确保公平,因此同一个列队中可能有多个作业同时运行。并发度高,对集群性能要求较高。若集群性能较低,可能出现所有作业都在缓慢运行但都没有运行完的情况,此时应换用容量调度器。

任务推测执行

引入

因硬件老化、软件bug等原因,一个作业的个别Map或Reduce任务可能运行得非常慢,拖慢整个作业的运行速度

推测执行机制

发现拖后腿的任务,比如某个任务运行速度远远低于平均运行速度,则为该任务启动一个备份任务。原任务和备份任务谁先运行完,则采用谁的结果。

执行推测任务的前提条件

  1. 每个Task只能有一个备份任务
  2. 当前作用的已完成的任务必须不小于5%
  3. 开启推测执行参数mapreduce.map.speculative,该参数在mapred-site.xml文件中是默认开启的

不能启用推测执行机制的情况

  1. 任务间存在严重的负载倾斜
  2. 多次执行的结果和单次执行的结果不一样的任务,比如任务向数据库中写数据

推测执行原理

  • 根据任务的当前进度progress, 启动时刻taskStartTime, 当前时刻currentTimestamp,可以推测该任务的完成时刻estimateEndTime;根据当前时刻currentTimestamp以及其他同类任务的平均完成时间averageRunTime,可以得到在此时为该任务开启备份任务,备份任务的完成时间backupEndTime
  • MapReduce总是选择(estimateEndTime - backupEndTime)差值最大的任务开启备份任务
  • 为了防止大量任务同时开启备份浪费资源,MapReduce为每个作业同时开启的备份任务数设置了上限