YARN是Hadoop的集群资源管理系统。YARN被引入Hadoop2,最初是为了改善MapReduce的实现,但它具有足够的通用性,同样可以支持其他的分布式计算模型。YARN提供请求和使用集群资源的API,但这些API很少直接用于用户代码。相反用户代码中用的是分布式计算框架提供的更高层API,这些API建立在YARN之上且向用户隐藏了资源管理细节。
还有一层应用是建立在上图框架之上。如Pig,Hive和Crunch都是运行在MapReduce,Spark或Tez(或三个都可)之上的处理框架,他们不和YARN直接打交道。
YARN通过两类长期运行的守护进程提供自己的核心服务:管理集群上资源使用的资源管理器(resource manager),运行在集群中所有节点上且能够启动和监控容器(container)的节点管理器(node manager)。容器用于执行特定应用程序的进程,每个容器都有资源限制(内存,CPU等)。一个容器可以是一个Unix进程,也可以是一个Linux cgroup,取决于YARN的配置。下图描述了YARN是如何运行一个应用的。
为了在YARN上运行一个应用,首先客户端联系资源管理器,要求它运行一个application master进程(步骤1)。然后资源管理器找到一个能够在容器中启动application master的节点管理器(步骤2a和2b)。准确地说application master一旦运行起来后能做些什么依赖于应用本身。有可能是在所处的容器中简单地运行一个计算,并将结果返回给客户端,或是向资源管理器请求更多的容器(步骤3),以用于运行一个分布式计算(步骤4a和4b)。后者是MapReduce Yarn应用所做的事情。
注意,从图中可以看出YARN本身不会为应用的各部分(客户端,master和进程)彼此间通信提供任何手段。大多数重要的YARN应用使用某种形式的远程通信机制(如Hadoop的RPC层)来向客户端传递状态更新和返回结果,但是这些通信机制都是专属于各应用的。
注意:客户端也有可能启动application master,可能在集群外或在与客户端相同的JVM中。这被称为"非托管的application master"。
1.资源请求
YARN有一个灵活的资源请求模型。当请求多个容器时,可以指定每个容器需要的计算机资源数量(内存和CPU),还可以指定对容器的本地限制要求。本地化对于确保分布式数据处理算法高效使用集群宽带非常重要,因此YARN允许一个应用为所申请的容器指定本地限制。本地限制可用于申请位于指定节点或机架或集群中任何位置(机架外)的容器。有时本地限制无法满足这种情况下要么不分配资源,或者可选择放松限制。例如一个节点由于已经运行了别的容器而无法再启动新的容器,这时如果有应用请求该节点,则YARN将尝试在同一机架中的其他节点上启动一个容器,如果还不行,则会尝试集群中的任何一个节点。YARN应用可以在运行中的任意时刻提出资源申请。例如可以在最开始提出所有的请求,或者为了满足不断变化的应用需要,采取更为动态的方式在需要更多资源时提出请求。
Spark采用了上述第一种方式,在集群上启动固定数量的执行器。另一方面,MapReduce则分两步走,在最开始时申请map任务容器,reduce任务容器的启用则放在后期。同样如果任何任务出现失败,将会另外申请容器以重新运行失败的任务。
2.应用生命周期
YARN应用的生命期差异性很大:有几秒的短期应用,也有连续运行几天甚至几个月的长期应用。与其关注应用运行多长时间不如按照应用到用户运行的作业之间的映射关系对应用进行分类更有意义。最简单的模型是一个用户作业对应一个应用,这也是MapReduce采取的方式。
第二种模型是,作业的每个工作流或每个用户对话对应一个应用。这种方法要比第一种情况效率更高,因为容器可以在作业之间重用,并且有可能缓存作业之间的中间数据。Spark采取的是这种模型。
第三种模型是,多个用户共享一个长期运行的应用。这种应用通常是作为一种协调者的角色在运行。例如Apache Slider有一个长期运行的application master,主要用于启动集群上的其他应用。Impala也使用这种模型提供了一个代理应用,Impala守护进程通过该代理请求集群资源。由于避免了启动新application master带来的开销,一个总是开启的application master意味着用户将获得非常低延迟的查询响应。
3.构建YARN应用
从无到有编写一个YARN应用是一件相当复杂的事,但在很多情况下不必这样。有很多现成的应用,在符合要求的情况下通常可以直接使用。例如如果你有兴趣运行一个作业的有向无环图,那么Spak或Tez就很合适;如果对流处理有兴趣Spark,Samza或Storm能提供帮助。
许多项目都简化了构建YARN应用的过程。先提到的Apache Slider使得在YARN上运行现有的分布式应用成为可能。对于一个应用(如HBase)来说,用户可以独立于其他用户集群上运行自己的实例,则意味着不同的用户能够运行同一应用的不同版本。Slider提供了控制手段,可以修改应用运行所在的节点的数量,也可以暂停和恢复应用的运行。