Yarn知识点整理
Yarn知识点整理
Yarn是一个资源调度平台,负责为计算框架提供服务器运算资源,相当于一个分布式操作系统平台,而MapReduce相当于应用程序。Yarn在Hadoop2之后引入MapReduce.
基本架构
- ResourceManager:
- 处理客户端请求
- 监控NodeManager状态
- 启动和监控ApplicationManager
- 资源的分配与调度
- NodeManager:
- 管理单个节点上的资源
- 处理来自ResourceManager的命令
- 处理来自ApplicationManager的命令
- ApplicationManager:
- 负责数据切分
- 为应用程序申请资源并分配给内部的任务
- 任务的监控与容错
- Container:
- Yarn资源的抽象,封装了节点的多维度资源,如内存、CPU、磁盘、网络等
工作机制
- Mr程序提交到MapReduce客户端所在节点
- MapReduce客户端的
YarnRunner
类向ResourceManager申请一个Application - ResourceManager将Mr程序的资源路径返回给
YarnRunner
- MapReduce客户端将运行Mr程序所需资源提交到HDFS
- 程序资源提交完毕后,MapReduce客户端向ResourceManager申请运行MRAppMaster
- ResourceManager将客户端的请求放入调度队列,根据规定的调度算法调度任务
- 当该作业被调度器调度执行,某个NodeManager领取到该作业
- 该NodeManager在本地创建Container,并创建MRAppMaster
- 该Container从HDFS上拷贝运行Task所需要的job信息
- MRAppMaster向ResourceManager申请MapTask资源
- ResourceManager将MapTask分配给另外的若干个NodeManager,这些NodeManager领取任务并创建Container
- MRAppMaster向接收到MapTask的NodeManager发送程序启动脚本,这些NodeManager从指定的HDFS路径读取数据,执行MapTask
- MRAppMaster等待所有MapTask运行到一定的进度后,向ResourceManager申请资源,运行ReduceTask
- ResourceManager将ReduceTask分配给另外的若干个NodeManager,这些NodeManager领取任务并创建Container,并从所有MapTask获得自己的数据分区
- 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任务可能运行得非常慢,拖慢整个作业的运行速度
推测执行机制
发现拖后腿的任务,比如某个任务运行速度远远低于平均运行速度,则为该任务启动一个备份任务。原任务和备份任务谁先运行完,则采用谁的结果。
执行推测任务的前提条件
- 每个Task只能有一个备份任务
- 当前作用的已完成的任务必须不小于5%
- 开启推测执行参数
mapreduce.map.speculative
,该参数在mapred-site.xml
文件中是默认开启的
不能启用推测执行机制的情况
- 任务间存在严重的负载倾斜
- 多次执行的结果和单次执行的结果不一样的任务,比如任务向数据库中写数据
推测执行原理
- 根据任务的当前进度
progress
, 启动时刻taskStartTime
, 当前时刻currentTimestamp
,可以推测该任务的完成时刻estimateEndTime
;根据当前时刻currentTimestamp
以及其他同类任务的平均完成时间averageRunTime
,可以得到在此时为该任务开启备份任务,备份任务的完成时间backupEndTime
- MapReduce总是选择(
estimateEndTime
-backupEndTime
)差值最大的任务开启备份任务 - 为了防止大量任务同时开启备份浪费资源,MapReduce为每个作业同时开启的备份任务数设置了上限