hadoop|计算框架从MapReduce1.0到Yarn

2018-01-15 14:20:00来源:https://mp.weixin.qq.com/s?__biz=MzI3NTkyMjA4NA==&mid=22作者:人点击

分享

01



HDFS


前面介绍了hadoop的分布式存储框架(HDFS),这个框架解决了大数据存储的问题,这是第一步。知道海量数据如何存储后,脚步不能停留,下一步要设计一个框架,用来玩(计算)这些数据时,资源(计算机集群)该如何调度,比如已知1PB的数据存储在了集群(1000台电脑组成)中的10台计算机(DataNode)中,现在要对这些数据进行Map和Reduce计算,该如何做呢?


在理解以下知识前,需要理解一些知识点。任何应用,比如打开一个word文档,打开QQ,都会占用一定的系统资源(CPU,内存,网络资源等),也就是应用要想正常运行就必须分配给它一定的资源,是谁负责分配给QQ软件资源的,一般都是操作系统内核中的资源调度器。


02



MapReduce1.0计算框架


通俗地讲,首先找到HDFS中的NameNode,因为这个节点可以提供我们1PB的数据都分布存储在哪些计算机中,找到后,直接去这些计算机上进行map和reduce计算就行了。


知道这个基本目标后,理解MapReduce的计算框架就会很简单,因为分布式框架的基本思想一般是Master-Slave模式,所以它也不例外,拿出一个进程作为Master,就是JobTracker, 运行和监控MapReduce的Job,负责将Task分配给TaskTracker,TaskTracker是什么?


TaskTracker是一个hadoop计算进程,运行在hadoop集群的DataNode节点上。TaskTracker的主要任务是运行JobTracker分配给它的实际计算任务,如运行Map、Reduce函数,Shuffle过程。TaskTracker任务具体运行在一组slots上,slots的数量可以配置,一般slots的数量会配置成和这台机器的CPU核心数量一致, TaskTracker被分配的task数量决定于当前还有多少个空闲的slots。当TaskTracker收到JobTracker分配的一个Task时,JobTracker会为这个Task单独启动一个jvm进程,也就是说,每个map、reduce任务都会单独运行在一个jvm进程中。TaskTracker在运行task的过程中会向JobTracker发送心跳信息,以此报告给JobTracker自己是否还活着。


当一个client向JobTracker提交任务时,具体过程如下:


client提交任务,JobTracker会接收Job请求;


JobTracker根据Job的输入参数向NameNode请求包含这些文件数据块的DataNode节点列表;


JobTracker确定Job的执行计划 :确定执行此job的Map、Reduce的task数量,并且分配这些task到离数据块最近的节点上;


JobTracker提交所有task到每个TaskTracker节点。TaskTracker会定时向JobTracker发送心跳,若一定时间没有收到心跳,JobTracker认为这个TaskTracker节点失败,然后JobTracker会把此节点上的task重新分配到其它节点上;


一旦所有的task执行完成,JobTracker会更新job状态为完成,若一定数量的task总数执行失败,这个job就会被标记为失败;


JobTracker发送job运行状态信息给Client端,完成闭环。


03



MapReduce1.x的主要缺点


在MapReduce1.x中,JobTracker 同时负责job的监控和系统资源的分配 ;Hadoop架构只支持MapReduce类型的job,所以它不是一个通用的框架,JobTracker和TaskTracker组件是深度耦合的。


根据设计模式中单一职责的原则,在MapReduce2.x,即Yarn中得到了解决,下面看下Yarn框架。


04



MapReduce2.0(Yarn)框架


在Yarn中把job的概念换成了 application ,因为在新的Hadoop2.x中,运行的应用不只是 MapReduce 了,还有可能是其它应用如一个 DAG (有向无环图Directed Acyclic Graph,例如storm应用),还能很方便的管理诸如Hive 、 Hbase 、 Pig 、 Spark / Shark 等应用。


这种新的架构设计能够使得各种类型的应用运行在Hadoop上面,并 通过Yarn从系统层面进行统一的管理 ,各种应用就可以互不干扰的运行在同一个Hadoop系统中,Yarn的地位相当于windows和linux操作系统的地位,这些操作系统的内核管理运行在它上面的各种进程,比如QQ,Chrom浏览器进程。


Yarn如何完成以上功能的?


Yarn,也就是二代MapReduce,主要的思想如下:


The fundamental idea of YARN is to split up the functionalities of resource management and job scheduling/monitoring into separate daemons. The idea is to have a global ResourceManager (RM) and per-application ApplicationMaster (AM) . An application is either a single job or a DAG of jobs.


把一代MapReduce的JobTracker同时做的两件事(资源调度和Job监控)分开, 资源管理 交给ResourceManager去做, Job监控 交给基于应用(类比于原来一代MapReduce中的Job)的App Master(AM)去做。


下面看下,ResourceManager和Application Master如何实现上述功能的?

4.1 ResourceManager


ResourceManage里头主要包括两个组件: Scheduler 和 ApplicationManager 。


4.1.1 Scheduler


Scheduler是一个 纯粹的 资源调度器,负责协调集群中各个应用的资源分配,保障整个集群的运行效率。


补充:


Yarn中将资源抽象出了一个模型:Container,是Yarn框架的计算单元,是具体执行应用(如map task、reduce task)的基本单位,一个Container就是一组分配的系统资源,比如CPU,内存,磁盘、网络等资源。 Container和集群节点的关系是:一个节点会运行多个Container,但一个Container不会跨节点。


4.1.2ApplicationManager


另一个组件ApplicationManager主要负责:


接收应用的提交请求,为应用分配第一个Container来运行ApplicationMaster,


负责监控ApplicationMaster,在遇到失败时重启ApplicationMaster运行的Container。


4.2Application Master


还记得一代MapReduce1.x中,JobTracker负责job的监控。而在MapReduce2中, 每个应用的管理、监控交由相应的分布在集群节点NodeManager中的ApplicationMaster ,如果某个ApplicationMaster失败,ResourceManager还可以重启它,这大大提高了集群的拓展性。


App master实例是在Container中启动起来的。 App Master向ResourceManager进行注册,注册之后客户端就可以查询ResourceManager获得自己ApplicationMaster的详细信息,以后就可以和自己的ApplicationMaster直接交互了。


在应用程序运行期间,提交应用的client主动和Application Master交流获得应用的运行状态、进度更新等信息。


4.3 NodeManager


每个节点都会有自己的NodeManager,NodeManager 管理这个节点上的资源分配和监控运行节点的健康状态,这是与一代MapReduce不同的地方,一代中统一由JobTracker集中管理。


NodeManager是一个slave服务:它负责接收ResourceManager的资源请求,然后交给Container,相关的应用运行在这个Container中。同时,它还负责监控并报告Container的使用信息 给ResourceManager 。


Yarn的架构示意图如下,应用(如map,reduce操作等)运行在Container中,NodeManager定时汇报自己的状态给ResourceManager,App master也汇报自己的状态给ResourceManager中的App manager。



05



MapReduce2.0的优势


Yarn框架相对一代的MapReduce有如下的优势,这些都在上文中做过阐述,具体如下:


大大减小了 ResourceManager 的资源消耗,因为有很多任务都分布到NodeManager节点上了;


ApplicationMaster 是一个可变更的部分,用户可以定制App master,让更多类型的编程模型能够跑在 Hadoop 集群中;


一代框架中,JobTracker 一个很大的负担就是监控 JobTracker 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,各个App master的运行情况交给ResourceManager 中的组件ApplicationsManager负责监测 ApplicationMaster 的运行状况。


Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离 。



算法channel会有系统地,认真地推送:机器学习(包含深度学习,强化学习等)的理论,算法,实践,源码实现。期待您的参与!






最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台