乐趣区

关于后端:Yarn的实现原理

Yarn 作为分布式集群的资源调度框架,它的呈现随同着 Hadoop 的倒退,使 Hadoop 从一个繁多的大数据计算引擎,成为一个集存储、计算、资源管理为一体的残缺大数据平台,进而倒退出本人的生态体系,成为大数据的代名词。

Yarn 的倒退过程

所以在咱们开始聊 Yarn 的实现原理前,有必要看看 Yarn 倒退的过程,这对你了解 Yarn 的原理以及为什么被称为资源调度框架很有帮忙。咱们在学习的 MapReduce 的架构时,MapReduce 应用程序的启动过程,最重要的就是要把 MapReduce 程序散发到大数据集群的服务器上,在 Hadoop 1 中,这个过程次要是通过 TaskTracker 和 JobTracker 通信来实现。

这个计划有什么毛病吗?

这种架构计划的次要毛病是,服务器集群资源调度治理和 MapReduce 执行过程耦合在一起,如果想在以后集群中运行其余计算工作,比方 Spark 或者 Storm,就无奈对立应用集群中的资源了

在 Hadoop 晚期的时候,大数据技术就只有 Hadoop 一家,这个毛病并不显著。但随着大数据技术的倒退,各种新的计算框架一直呈现,咱们不可能为每一种计算框架部署一个服务器集群,而且就算能部署新集群,数据还是在原来集群的 HDFS 上。所以咱们须要把 MapReduce 的资源管理和计算框架离开,这也是 Hadoop 2 最次要的变动,就是将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。

Yarn 的架构组成

Yarn 是“Yet Another Resource Negotiator”的缩写,字面意思就是“另一种资源调度器”。事实上,在 Hadoop 社区决定将资源管理从 Hadoop 1 中分离出来,独立开发 Yarn 的时候,业界曾经有一些大数据资源管理产品了,比方 Mesos 等,所以 Yarn 的开发者索性管本人的产品叫“另一种资源调度器”。这种命名办法并不鲜见,已经名闻遐迩的 Java 我的项目编译工具 Ant 就是“Another Neat Tool”的缩写,意思是“另一种整顿工具”。

下图是 Yarn 的架构。

从图上看,Yarn 包含两个局部:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。这也是 Yarn 的两种次要过程:ResourceManager 过程负责整个集群的资源调度治理,通常部署在独立的服务器上;NodeManager 过程负责具体服务器上的资源和工作治理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 过程一起呈现。

具体说来,资源管理器又包含两个次要组件:调度器和应用程序管理器。

调度器其实就是一个资源分配算法,依据应用程序(Client)提交的资源申请和以后服务器集群的资源情况进行资源分配。Yarn 内置了几种资源调度算法,包含 Fair Scheduler、Capacity Scheduler 等,你也能够开发本人的资源调度算法供 Yarn 调用。

Yarn 进行资源分配的单位是容器(Container),每个容器蕴含了一定量的内存、CPU 等计算资源,默认配置下,每个容器蕴含一个 CPU 外围。容器由 NodeManager 过程启动和治理,NodeManger 过程会监控本节点上容器的运行状况并向 ResourceManger 过程汇报。

应用程序管理器负责应用程序的提交、监控利用程序运行状态等。应用程序启动后须要在集群中运行一个 ApplicationMaster,ApplicationMaster 也须要运行在容器外面。每个应用程序启动后都会先启动本人的 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 集群中就能够同时并发执行各种不同的大数据计算框架,实现资源的对立调度治理。

Yarn 的设计准则

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 MVC,Tomcat 的代码里不可能有任何一行对于 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 模块,也早已被这些计算引擎的开发者做进去供咱们应用了。

本文由 mdnice 多平台公布

退出移动版