Apache YARN(Yet Another Resource Negotiator) 是Hadoop的集群资源管理系统。YARN被引入Hadoop2最初是为了改善MapReduce的实现,但它具有足够的通性,同样可以支持其他的分布式计算模式。
YARN在Hadoop2.0中与其它组件关系:
Yarn职责说明:
通用的统一的资源管理系统,同时运行长应用程序和短应用程序
长应用: 永不停止运行,如 service,spark,storm ,http server等
短应用: 短时间内会结束的程序,如map job ,spark job
YARN的架构
ResourceManager : 管理集群上资源
NodeManager : 运行在所有几点上且能够启动和监控容器(container)
Container: 用于执行特定应用程序的进程,每个容器都有有限的资源限制(CPU,内存)
ApplicationMaster: 负责调度协调
1. 应用启动流程
《hadoop权威指南》中在Yarn中运行一个应用程序的过程:
为了在YARN上运行一个应用,首先客户端联系资源管理器,要求它运行一个application master进程(步骤1)。
然后资源管理器找到一个能够在容器中启动application master的节点管理器(步骤2a和2b)。准确地说application master一旦运行起来后能做些什么依赖于应用本身。有可能是在所处的容器中简单地运行一个计算,并将结果返回给客户端,或是向资源管理器请求更多的容器(步骤3),以用于运行一个分布式计算(步骤4a和4b)。后者是MapReduce Yarn应用所做的事情。
下面这张图更详细的描述了应用启动的过程:
2.应用生命周期
YARN应用的生命期差异性很大:有几秒的短期应用,也有连续运行几天甚至几个月的长期应用。与其关注应用运行多长时间不如按照应用到用户运行的作业之间的映射关系对应用进行分类更有意义。最简单的模型是一个用户作业对应一个应用,这也是MapReduce采取的方式。
第二种模型是,作业的每个工作流或每个用户对话对应一个应用。这种方法要比第一种情况效率更高,因为容器可以在作业之间重用,并且有可能缓存作业之间的中间数据。Spark采取的是这种模型。
第三种模型是,多个用户共享一个长期运行的应用。这种应用通常是作为一种协调者的角色在运行。例如Apache Slider有一个长期运行的application master,主要用于启动集群上的其他应用。Impala也使用这种模型提供了一个代理应用,Impala守护进程通过该代理请求集群资源。由于避免了启动新application master带来的开销,一个总是开启的application master意味着用户将获得非常低延迟的查询响应。
3. Yarn中的调度
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在Yarn中,负责给应用分配资源的就是Scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn提供了多种调度器和可配置的策略供我们选择。
调度器的选择
在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS cheduler。
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
下面“Yarn调度器对比图”展示了这几个调度器的区别,从图中可以看出,在FIFO 调度器中,小任务会被大任务阻塞。
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在下图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
参考:
官方文档: http://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/YARN.html
hadoop1.0到2.0演进文档: https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
《hadoop 权威指南》