You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
9.2 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 09 | 为什么我们管Yarn叫作资源调度框架
我们知道Hadoop主要是由三部分组成除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce还有一个是分布式集群资源调度框架Yarn。但是Yarn并不是随Hadoop的推出一开始就有的Yarn作为分布式集群的资源调度框架它的出现伴随着Hadoop的发展使Hadoop从一个单一的大数据计算引擎成为一个集存储、计算、资源管理为一体的完整大数据平台进而发展出自己的生态体系成为大数据的代名词。
所以在我们开始聊Yarn的实现原理前有必要看看Yarn发展的过程这对你理解Yarn的原理以及为什么被称为资源调度框架很有帮助。
先回忆一下我们学习的MapReduce的架构在MapReduce应用程序的启动过程中最重要的就是要把MapReduce程序分发到大数据集群的服务器上在Hadoop 1中这个过程主要是通过TaskTracker和JobTracker通信来完成。
这个方案有什么缺点吗?
这种架构方案的主要缺点是,**服务器集群资源调度管理和MapReduce执行过程耦合在一起如果想在当前集群中运行其他计算任务比如Spark或者Storm就无法统一使用集群中的资源了**。
在Hadoop早期的时候大数据技术就只有Hadoop一家这个缺点并不明显。但随着大数据技术的发展各种新的计算框架不断出现我们不可能为每一种计算框架部署一个服务器集群而且就算能部署新集群数据还是在原来集群的HDFS上。所以我们需要把MapReduce的资源管理和计算框架分开这也是Hadoop 2最主要的变化就是将Yarn从MapReduce中分离出来成为一个独立的资源调度框架。
Yarn是“Yet Another Resource Negotiator”的缩写字面意思就是“另一种资源调度器”。事实上在Hadoop社区决定将资源管理从Hadoop 1中分离出来独立开发Yarn的时候业界已经有一些大数据资源管理产品了比如Mesos等所以Yarn的开发者索性管自己的产品叫“另一种资源调度器”。这种命名方法并不鲜见曾经名噪一时的Java项目编译工具Ant就是“Another Neat Tool”的缩写意思是“另一种整理工具”。
下图是Yarn的架构。
![](https://static001.geekbang.org/resource/image/af/b1/af90905013e5869f598c163c09d718b1.jpg)
从图上看Yarn包括两个部分一个是资源管理器Resource Manager一个是节点管理器Node Manager。这也是Yarn的两种主要进程ResourceManager进程负责整个集群的资源调度管理通常部署在独立的服务器上NodeManager进程负责具体服务器上的资源和任务管理在集群的每一台计算服务器上都会启动基本上跟HDFS的DataNode进程一起出现。
具体说来,资源管理器又包括两个主要组件:调度器和应用程序管理器。
调度器其实就是一个资源分配算法根据应用程序Client提交的资源申请和当前服务器集群的资源状况进行资源分配。Yarn内置了几种资源调度算法包括Fair Scheduler、Capacity Scheduler等你也可以开发自己的资源调度算法供Yarn调用。
Yarn进行资源分配的单位是容器Container每个容器包含了一定量的内存、CPU等计算资源默认配置下每个容器包含一个CPU核心。容器由NodeManager进程启动和管理NodeManger进程会监控本节点上容器的运行状况并向ResourceManger进程汇报。
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个ApplicationMasterApplicationMaster也需要运行在容器里面。每个应用程序启动后都会先启动自己的ApplicationMaster由ApplicationMaster根据应用程序的资源需求进一步向ResourceManager进程申请容器资源得到容器以后就会分发自己的应用程序代码到容器上启动进而开始分布式计算。
我们以一个MapReduce程序为例来看一下Yarn的整个工作流程。
1.我们向Yarn提交应用程序包括MapReduce ApplicationMaster、我们的MapReduce程序以及MapReduce Application启动命令。
2.ResourceManager进程和NodeManager进程通信根据集群资源为用户程序分配第一个容器并将MapReduce ApplicationMaster分发到这个容器上面并在容器里面启动MapReduce ApplicationMaster。
3.MapReduce ApplicationMaster启动后立即向ResourceManager进程注册并为自己的应用程序申请容器资源。
4.MapReduce ApplicationMaster申请到需要的容器后立即和相应的NodeManager进程通信将用户MapReduce程序分发到NodeManager进程所在服务器并在容器中运行运行的就是Map或者Reduce任务。
5.Map或者Reduce任务在运行期和MapReduce ApplicationMaster通信汇报自己的运行状态如果运行结束MapReduce ApplicationMaster向ResourceManager进程注销并释放所有的容器资源。
MapReduce如果想在Yarn上运行就需要开发遵循Yarn规范的MapReduce ApplicationMaster相应地其他大数据计算框架也可以开发遵循Yarn规范的ApplicationMaster这样在一个Yarn集群中就可以同时并发执行各种不同的大数据计算框架实现资源的统一调度管理。
细心的你可能会发现我在今天文章开头的时候提到Hadoop的三个主要组成部分的时候管HDFS叫分布式文件**系统**管MapReduce叫分布式计算**框架**管Yarn叫分布式集群资源调度**框架**。
为什么HDFS是系统而MapReduce和Yarn则是框架
框架在架构设计上遵循一个重要的设计原则叫“**依赖倒转原则**”,依赖倒转原则是**高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。**
所谓高层模块和低层模块的划分简单说来就是在调用链上处于前面的是高层后面的是低层。我们以典型的Java Web应用举例用户请求在到达服务器以后最先处理用户请求的是Java Web容器比如Tomcat、Jetty这些通过监听80端口把HTTP二进制流封装成Request对象然后是Spring MVC框架把Request对象里的用户参数提取出来根据请求的URL分发给相应的Model对象处理再然后就是我们的应用程序负责处理用户请求具体来看还会分成服务层、数据持久层等。
在这个例子中Tomcat相对于Spring MVC就是高层模块Spring MVC相对于我们的应用程序也算是高层模块。我们看到虽然Tomcat会调用Spring MVC因为Tomcat要把Request交给Spring MVC处理但是Tomcat并没有依赖Spring MVCTomcat的代码里不可能有任何一行关于Spring MVC的代码。
那么Tomcat如何做到不依赖Spring MVC却可以调用Spring MVC如果你不了解框架的一般设计方法这里还是会感到有点小小的神奇是不是
秘诀就是Tomcat和Spring MVC都依赖J2EE规范Spring MVC实现了J2EE规范的HttpServlet抽象类即DispatcherServlet并配置在web.xml中。这样Tomcat就可以调用DispatcherServlet处理用户发来的请求。
同样Spring MVC也不需要依赖我们写的Java代码而是通过依赖Spring MVC的配置文件或者Annotation这样的抽象来调用我们的Java代码。
所以Tomcat或者Spring MVC都可以称作是框架它们都遵循依赖倒转原则。
现在我们再回到MapReduce和Yarn。实现MapReduce编程接口、遵循MapReduce编程规范就可以被MapReduce框架调用在分布式集群中计算大规模数据实现了Yarn的接口规范比如Hadoop 2的MapReduce就可以被Yarn调度管理统一安排服务器资源。所以说MapReduce和Yarn都是框架。
相反地HDFS就不是框架使用HDFS就是直接调用HDFS提供的API接口HDFS作为底层模块被直接依赖。
## 小结
Yarn作为一个大数据资源调度框架调度的是大数据计算引擎本身。它不像MapReduce或Spark编程每个大数据应用开发者都需要根据需求开发自己的MapReduce程序或者Spark程序。而现在主流的大数据计算引擎所使用的Yarn模块也早已被这些计算引擎的开发者做出来供我们使用了。作为普通的大数据开发者我们几乎没有机会编写Yarn的相关程序。但是这是否意味着只有大数据计算引擎的开发者需要基于Yarn开发才需要理解Yarn的实现原理呢
恰恰相反我认为理解Yarn的工作原理和架构对于正确使用大数据技术理解大数据的工作原理是非常重要的。在云计算的时代一切资源都是动态管理的理解这种动态管理的原理对于理解云计算也非常重要。Yarn作为一个大数据平台的资源管理框架简化了应用场景对于帮助我们理解云计算的资源管理很有帮助。
## 思考题
Web应用程序的服务层Service和数据持久层DAO也是上下层模块关系你设计的Service层是否按照框架的一般架构方法遵循依赖倒转原则
欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。