为什么我们管Yarn叫作资源调度框架

Hadoop是由三部分组成的,之前说的MapReduce,还有分布式文件存储系统HDFS,和分布式集群资源调度框架Yarn。本篇专栏将主要讲一下Yarn框架,它使Hadoop从一个单一的大数据计算引擎,成为一个集存储、计算、资源管理为一体的完整大数据平台,进而发展处自己的生态体系。

Yarn发展

首先来看一下MapReduce的架构思路:MapReduce最核心的就是JobTracker和TaskTracker相互之间的通信,由JobTracker分派任务,监控TaskTracker完成任务。

这个方案的缺点是什么呢?
服务器集群资源调度管理和MapReduce执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如Spark或者Storm,就无法统一使用集群中的资源了。

Yarn是一种资源调度框架,架构图如下:
在这里插入图片描述
从图中可以看出Yarn包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。这也是Yarn两种主要进程:ResourceManager进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NodeManager进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟HDFS的DataNode进程一起出现。

这就是上一篇专栏说的,相同的架构模式:一主多从

ResourceManager

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

(1)调度器
调度器其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。Yarn内置了几种资源调度算法,包括:Fair Scheduler、Capacity Scheduler等等,也可以开发自己的资源调度算法供Yarn调用。

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

(2)应用程序管理器

应用程序管理器负责应用的程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个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,并且不仅仅是MapReduce。其他的像Spark、Storm也一样,也需要遵循Yarn规范的ApplicationMaster,这样就实现了并发执行各种各样不同的大数据计算框架,实现资源的统一调度管理。

还有一个问题:为什么HDFS是系统,而MapReduce和Yarn是框架?

是因为框架在架构设计上遵循一个重要的设计原则叫“依赖倒转原则”,依赖倒转原则是高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。就像一主多从一样。

那么,什么是高层模块,什么是低层模块?

以Java Web应用举例:

  1. 用户从前端发送请求之后,最先处理用户请求的是想Tomcat、Jetty这些JavaWeb容器,通过监听80端口,将HTTP请求以二进制流封装成Request对象
  2. 然后到达SpringMVC框架,把Request里面的用户参数抽取出来,根据URL给予对应的Model对象处理。
  3. 接着,在应用程序处理用户请求,完成实际业务,具体来看会分成服务层和数据持久层。

在这个例子中,Tomcat相对于Spring MVC就是高层模块,SpringMVC相对于我们的应用程序也是高层模块。

Tomcat不依赖这二者,虽然不依赖,但是可以做到相互通信,这是为什么呢?

因为Tomcat和SpringMVC都依赖J2EE规范,SpringMVC实现了J2EE规范的HTTPServlet抽象类,也就是DispatchServlet,配置在web.xml中。这样Tomcat就可以使用DispatchServlet处理用户请求。

同样SpringMVC也不依赖于应用程序也就是Java代码,而是通过依赖SpringMVC的配置文件或者Annotation这样的抽象,来调用我们的Java代码。

所以,Tomcat或者SpringMVC都可以称作是框架,都遵循依赖倒转原则。

回到MapReduce和Yarn

通过实现MapReduce编程接口、遵循MapReduce编程规范就可以实现分布式计算。实现了Yarn接口规范,就可以被Yarn调度管理,统一安排服务器资源。所以说它们是框架。

相反地,HDFS不是框架,使用HDFS就是直接调用HDFS提供的API接口,HDFS作为底层模块被直接依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值