YARN (Yet Another Resource Negotiator) 是Apache Hadoop中的集群资源管理系统,负责收集集群中各个节点资源情况并响应资源分配请求,根据不同的策略分配相应的节点资源。
YARN 在Hadoop 2中被引入,在此之前,资源管理系统MapReduce 1与Hadoop平台紧耦合,且设计上对节点支持数量较低。在Hadoop2中,资源管理系统被重构并抽象,独立成一个通用的资源管理系统,支持其他大数据计算平台接入,如如日中天的Spark就可以运行在YARN上。此外,重新设计的YARN开始支持更多的节点和任务。
在YARN中,有两种组件Resource Manager和Node Manager。Resource Manager是YARN的管理中心,负责汇总所有节点的资源信息并响应资源分配请求;Node Manager运行在每个节点上,负责启动并监控容器、资源。
步骤
在Hadoop中,一个MapReduce任务的执行步骤如下:
首先,客户端与Resource Manager通信,请求启动一个任务;
Resource Manager选择一个节点,然后启动该任务对应的Application Master;
Application Master请求输入文件的block信息,然后按照block个数,按照本地性策略向Resource Manager请求资源;
获取到资源后,请求响应的Node Manager,启动mapper任务;
Application Master监控任务执行情况,当一定比例的mapper任务结束后,请求设定数量的资源以启动Reducer;
监控任务执行,在完成后释放资源。
MapReduce中数据通信量较大,为了尽可能的减少数据传输,MapReduce采取了本地性策略,即计算资源离数据尽可能的尽,YARN会根据AM的请求,选择合适的节点。
YANR的资源分配比较灵活,可以在启动时一次性申请所有资源,也可以在运行时动态的申请资源,Spark采用的是前者,并且复用了资源,而MapReduce采用的则是后一种,两阶段申请资源,且用完后就释放。
调度策略
在真实场景下的集群,通常不会拥有无限的资源,那么在资源有限的情况下如何去管理和分配这些资源。不同的业务场景下,倾向不同,很难说有一个策略适合所有的场景,所以YARN提供了一些调度策略,以便在特定的场景下采取最合适的策略。
FIFO
固定思议,FIFO策略是简单的策略,它采取了先进先出的模式,当前一个任务的资源得到满足后再开始处理后一个任务的资源请求,而且对资源的使用没有限制。这种策略下,能得到最大的资源使用率(前提是即便获取到部分资源,任务也能立即开始执行),但是也带来了一些弊端,例如当一个大任务占用了所有资源后,小任务的资源请求无法得到满足,需要等待大任务完成才能开始。
Capacity
为了缓解FIFO策略的小任务等待时间过长问题,提出了Capacity策略,即将全部资源划分成若干队列,每个队列拥有一定的资源,大任务执行时仍然会预留一定的资源给小任务。通过预留资源的形式,缓解了小任务的延迟,但是由于资源没有充分利用,降低了一定的资源使用率。
这种策略也可以用于划分优先级,即预留一些资源给高优先级任务。
Fair Schedulers
在多租户场景下,如何保证公平和保持高资源使用率。Fair Schedulers就是为了解决这样的问题,它像一个弹性的Capacity策略,当集群比较空闲时,任务可以获得全部的资源,但是当下一个任务来临时,YARN会分出一半的资源分配给新任务,默认情况下,资源不可剥夺,所以存在一定的延迟,是一种最终公平性。
相比较于Capacity策略,Fair Schedulers无需预留资源。
延迟调度
延迟调度不是一个单独的策略,而是独立于具体策略的一个优化。考虑到在实际情况下,任务的本地性约束可能无法立即满足,但是相关节点能在短时间内空闲,这种情况下,等待更合适节点资源更加合理,所以YARN会等待一定时间,等待相关资源被释放,如果超时后仍然未获得资源,才分配其他的节点。
容错
在大量节点的集群中,出错时有发生,或节点本身出现故障,或网络故障,抑或是任务编写有bug,异常退出。为了减少异常带来的问题,YARN根据不同类型的异常提供了不同的恢复方式。
Task Failure
每一个具体的任务由相应的Application Master负责监控,所以当AM发现容器运行异常时(超时机制、异常退出),会请求新的节点,然后重新启动相关的子任务,当失败次数超过一定限制时,认为是代码编写错误,不再重试。
Application Master Failure
Resource Manager通过超时机制来检测AM的运行情况,当AM出现异常时,Resource Manager会启动新的AM,当该AM启动后,根据job history获取子任务的执行情况,避免重新运行这些任务。
Node Manager Failure
节点故障通常时通过超时机制来检测的,在节点出现故障后,会带来子任务和AM的失败,直接通过上述两种容错机制即可解决,不需要其他的处理。
当节点故障超过一定次数时,YARN会选择排除该高故障节点。
Resource Manager Failure
RM是YARN中最上层的组件,没有其他组件来监控它,所以Resource Manager的容错需要靠集群来解决。通过组建Resource Manager集群,一活多备的形式来达成高可用,当活跃RM失败时,其他的RM迅速接管,由于RM故障后集群状态信息会丢失,所以该部分数据是存储在可靠分布式存储上的(ZK、HDFS,主要是任务元信息)。
当新的RM启用后,由于不知道AM的状态,所以会重启所有的AM,然后再由AM去检测具体的子任务执行情况。