在说Hadoop Yarn的原理以前,咱们先来看看Yarn是怎样出现的。在古老的Hadoop1.0中,MapReduce的JobTracker负责了太多的工做,包括资源调度,管理众多的TaskTracker等工做。这天然就会产生一个问题,那就是JobTracker负载太多,有点“忙不过来”。因而Hadoop在1.0到2.0的升级过程当中,便将JobTracker的资源调度工做独立了出来,而这一改动,直接让Hadoop成为大数据中最稳固的那一块基石。,而这个独立出来的资源管理框架,就是Hadoop Yarn框架 。html
在详细介绍Yarn以前,咱们先简单聊聊Yarn,Yarn的全称是Yet Another Resource Negotiator,意思是“另外一种资源调度器”,这种命名和“有间客栈”这种可谓是殊途同归之妙。这里多说一句,之前Java有一个项目编译工具,叫作Ant,他的命名也是相似的,叫作“Another Neat Tool”的缩写,翻译过来是”另外一种整理工具“。node
既然都叫作资源调度器了,那么天然,它的功能也是负责资源管理和调度的,接下来,咱们就深刻到Yarn框架内部一探究竟吧。程序员
这张图能够说是Yarn的全景图,咱们主要围绕上面这张图展开,介绍图中的每个细节部分。首先,咱们会介绍里面的Container的概念以及相关知识内容,而后会介绍图中一个个组件,最后看看提交一个程序的流程。算法
容器(Container)这个东西是Yarn对资源作的一层抽象。就像咱们平时开发过程当中,常常须要对底层一些东西进行封装,只提供给上层一个调用接口同样,Yarn对资源的管理也是用到了这种思想。网络
如上所示,Yarn将CPU核数,内存这些计算资源都封装成为一个个的容器(Container)。须要注意两点:架构
其中NodeManager和ResourceManager这两个组件会在下面讲到。app
再看最上面的图,咱们能直观发现的两个主要的组件是ResourceManager和NodeManager,但其实还有一个ApplicationMaster在图中没有直观显示(其实就是图中的App Mstr,图里用了简写)。三个组件构成了Yarn的全景,这三个组件的主要工做是什么,Yarn 框架又是如何让他们相互配合的呢,咱们分别来看这三个组件。框架
咱们先来讲说上图中最中央的那个ResourceManager(RM)。从名字上咱们就能知道这个组件是负责资源管理的,在运行过程当中,整个系统有且只有一个RM,系统的资源正是由RM来负责调度管理的。RM包含了两个主要的组件:定时调用器(Scheduler)以及应用管理器(ApplicationManager),咱们分别来看看它们的主要工做。分布式
定时调度器(Scheduler):从本质上来讲,定时调度器就是一种策略,或者说一种算法。当Client提交一个任务的时候,它会根据所须要的资源以及当前集群的资源情况进行分配。注意,它只负责向应用程序分配资源,并不作监控以及应用程序的状态跟踪。工具
应用管理器(ApplicationManager):一样,听名字就能大概知道它是干吗的。应用管理器就是负责管理Client用户提交的应用。上面不是说到定时调度器(Scheduler)不对用户提交的程序监控嘛,其实啊,监控应用的工做正是由应用管理器(ApplicationManager)完成的。
OK,明白了资源管理器ResourceManager,那么应用程序如何申请资源,用完如何释放?这就是ApplicationMaster的责任了。
每当Client(用户)提交一个Application(应用程序)时候,就会新建一个ApplicationMaster。由这个ApplicationMaster去与ResourceManager申请容器资源,得到资源后会将要运行的程序发送到容器上启动,而后进行分布式计算。
这里可能有些难以理解,为何是把运行程序发送到容器上去运行?若是以传统的思路来看,是程序运行着不动,而后数据进进出出不停流转。但当数据量大的时候就无法这么玩了,由于海量数据移动成本太大,时间太长。可是中国有一句老话山不过来,我就过去。大数据分布式计算就是这种思想,既然大数据难以移动,那我就把容易移动的应用程序发布到各个节点进行计算呗,这就是大数据分布式计算的思路。
那么最后,资源有了,应用程序也有了,那么该怎么管理应用程序在每一个节点上的计算呢?别急,咱们还有一个NodeManager。
相比起上面两个组件的掌控全局,NodeManager就显得比较细微了。NodeManager是ResourceManager在每台机器的上代理,主要工做是负责容器的管理,并监控他们的资源使用状况(cpu,内存,磁盘及网络等),而且它会按期向ResourceManager/Scheduler提供这些资源使用报告,再由ResourceManager决定对节点的资源进行何种操做(分配,回收等)。
这张图简单地标明了提交一个程序所经历的流程,接下来咱们来具体说说每一步的过程。
Client向Yarn提交Application,这里咱们假设是一个MapReduce做业。
ResourceManager向NodeManager通讯,为该Application分配第一个容器。并在这个容器中运行这个应用程序对应的ApplicationMaster。
ApplicationMaster启动之后,对做业(也就是Application)进行拆分,拆分task出来,这些task能够运行在一个或多个容器中。而后向ResourceManager申请要运行程序的容器,并定时向ResourceManager发送心跳。
申请到容器后,ApplicationMaster会去和容器对应的NodeManager通讯,然后将做业分发到对应的NodeManager中的容器去运行,这里会将拆分后的MapReduce进行分发,对应容器中运行的多是Map任务,也多是Reduce任务。
容器中运行的任务会向ApplicationMaster发送心跳,汇报自身状况。当程序运行完成后,ApplicationMaster再向ResourceManager注销并释放容器资源。
以上就是一个做业的大致运行流程。
小结:此次咱们介绍了Hadoop yarn的主要架构原理以及yarn上任务的运行流程。咱们说了yarn的几个主要的组件,各自的责任,以及如何与其余组件协做调和。最后咱们再来讲说为何会有Yarn这么个框架的出现吧~~
上面说了这么多,最后咱们来聊聊为何会有Yarn吧。
直接的缘由呢,就是由于Hadoop1.0中架构的缺陷,在MapReduce中,jobTracker担负起了太多的责任了,接收任务是它,资源调度是它,监控TaskTracker运行状况仍是它。这样实现的好处是比较简单,但相对的,就容易出现一些问题,好比常见的单点故障问题。
要解决这些问题,只能将jobTracker进行拆分,将其中部分功能拆解出来。彼时业内已经有了一部分的资源管理框架,好比mesos,因而照着这个思路,就开发出了Yarn。这里多说个冷知识,其实Spark早期是为了推广mesos而产生的,这也是它名字的由来,不事后来反正是Spark火起来了。。。
闲话很少说,其实Hadoop能有今天这个地位,Yarn能够说是功不可没。由于有了Yarn,更多计算框架能够接入到Hdfs中,而不仅仅是MapReduce,到如今咱们都知道,MapReduce早已经被Spark等计算框架赶超,而Hdfs却依然屹立不倒。究其缘由,正式由于Yarn的包容,使得其余计算框架能专一于计算性能的提高。Hdfs可能不是最优秀的大数据存储系统,但倒是应用最普遍的大数据存储系统,Yarn功不可没。
推荐阅读 :
从分治算法到 MapReduce
一个故事告诉你什么才是好的程序员
大数据存储的进化史 --从 RAID 到 Hadoop Hdfs