前言
到目前为止,我们已经对Hadoop中HDFS、MapReduce有了一定的认识。在接下来几个章节,我们来学习另外一个框架YARN。
YARN简介
Apache YARN(Yet Another Resource Negotiator)是Hadoop的集群资源管理系统
。YARN被引入Hadoop 2,最初是为了改善MapReduce的实现,但它具有足够的通用性,通用可以支持其他的分布式计算模式。
YARN提供请求和使用集群的API,但是这些API很少直接与用于用户代码。相反,用户代码中用的是分布式计算框架提供的更高层API,这些API建立在YARN之上且向用户因此了资源管理细节。站在YARN的角度上来看,MapReduce、Spark等框架,只是使用YARN的应用程序而已。
还有一层是建立在应用层框架之上,例如Hive、Pig等都是运行在MapReduce、Spark之上的处理框架(实际上还有我们自己编写的MR、Spark程序等),它们不和YARN直接打交道。
YARN应用运行机制
YARN通过两类长期运行的守护进程提供自己的核心服务:管理集群上资源使用的资源管理器
(Resource Manager)、运行在集群中所有节点上且能够启动和监控容器
(Container)的节点管理器
(Node Manager)。容器用于执行特定应用程序的进程,每个容器都有资源限制(内存、CPU等)。一个程序可以是一个Unix进程,也可以是一个Linux cgroup,取决于YARN的配置。
下图描述了YARN是如何运行一个应用的。
为了在YARN上运行一个应用,首先,客户端联系ResourceManager,要求它运行一个application master
进程。然后,ResourceManager找到一个能够在容器中启动application master的NodeManager。准确地说,application master一旦运行起来以后能做些什么依赖于应用本身。有可能是在所处的容器中简单地运行一个计算,并将结果返回给客户端,或是想ResourceManager请求更多的容器,以用于运行一个分布式计算。后者是MapReduce YARN应用所做的事情。
从上图中可以看出,YARN本身不会为应用的各个部分(客户端、Master和进程)彼此间通信提供任何手段。大多数重要的YARN应用使用某种形式的远程通信机制来向客户端传递状态更新和返回结果,但是这些通信机制都是专属于各应用的。
资源请求
YARN有一个灵活的资源请求模型。当请求多个容器时,可以指定每个容器需要的计算机资源数量(内存和CPU),还可以指定对容器的本地限制要求。
本地化对于确保分布式数据处理算法高校使用集群带宽非常重要,因此,YARN允许一个应用为所申请的容器指定本地限制。本地限制可用于申请位于指定节点或机架,或集群中任何位置(机架外)的容器。
有时本地限制无法被满足,这种情况下要么不分配资源,或者可选择放松限制。例如,一个节点由于已经运行了别的容器而无法再启动新的容器,这时如果有应用请求该节点,则YARN将尝试在同一机架中的其他节点上启动一个容器,如果还不行,则会尝试集群中的任何一个节点。
通常情况下,当启动一个容器用于处理HDFS数据块时,应用将会向这样的节点申请容器:存储该数据块三个副本的节点,或是存储这些副本的机架中的一个节点。如果都申请失败,则申请集群中的任意节点。
YARN应用可以在运行中的任意时刻提出资源申请。例如,可以在最开始提出所有的请求,或者为了满足不断变化的应用需要,采用更为动态的方式在需要更多资源时提出请求。
Spark采用了上述第一种方式,在集群上启动固定数量的执行器(Executor)。另一方面,MapReduce则分两步走,在最开始时申请map任务容器,reduce任务容器的启用则放在后期。同样,如果任何任务出现失败,将会另外申请容器以重新运行失败的任务。
应用生命周期
YARN应用的生命周期差异性很大:有几秒的短期应用,也有连续运行几天甚至几个月的长期应用。与其关注应用运行多长时间,不如按照应用到用户运行的作业之间的映射关系对应用进行分类更有意义。最简单的模型是一个用户作业对应一个应用,这也是MapReduce采取的方式。
第二种模型是,作业的每个工作流或每个用户对话对应一个应用。这种方法要比第一种情况效率更高,因为容器可以在作业之间重用,并且有可能缓存作业之间的中间数据,Spark采取的是这种模型。
构建YARN应用
从无到有编写一个YARN应用是一件相当复杂的事情,但在很多情况下不必这样。有很多现成的应用,在符合要求的情况下通常可以直接使用。例如,Spark、Flink、MapReduce等。
不过,如果你真的想要尝试编写一个YARN应用,官方给出了一个distributed shell
例子来说明如何编写YARN应用,该示例演示了如何使用YARN客户端API来处理客户端或application master与YARN守护进程之间的通信。
小结
本章介绍了YARN框架的基本概念,YARN是Hadoop集群的资源管理系统,构建在YARN之上的应用可以使用YARN来申请资源,运行一些计算程序。YARN主要分为ResourceManager和NodeManager,其中NodeManager负责为应用启动容器,用户编写的程序会在容器中运行。对于YARN来说,MapReduce、Spark都算是它的应用程序,而我们编写的程序又处于这些框架之上。