首页 > BigData, MapReduce, YARN > From MapReduce To YARN

From MapReduce To YARN

Google MapReduce

MapReduce是由Google提出的一种软件架构,用于大规模数据的并行计算。Map和Reduce这两个概念,是从函数式编程语言中借鉴过来的。正如Google MapReduce Paper中所描述,MapReduce是这样一个过程:输入是Key/Value对A,用户指定一个Map函数来处理A,得到一个中间结果Key/Value集合B,再由用户指定的Reduce函数来把B中相同Key的Value归并到一起,计算得到最终的结果集合C,这就是MapReduce的基本原理,可以简单的表达为:
map (k1, v1) -> list (k2, v2)
reduce (k2, list(v2)) -> list (v2)

MapReduce的原理本身比较简单,但开发一套完备、易用性好的MapReduce系统,不是一件容易的事。这里会涉及分布式系统的故障容错、负载均衡等一系列复杂的问题。下面就结合在Google MapReduce Paper所讲的MapReduce的执行流程,来介绍一下MapReduce系统的基本工作原理:
mapreduce
在上图中,我们可以看到,MapReduce系统中有三种角色,一是用于Job调度与管理的Master进程;二是实际执行Map/Reduce Task的Worker进程;三是用户向MapReduce系统提交Job的MapReduce Client。用户提交一个MapReduce Job到Job执行完成,是这样一个过程:

  • 用户通过MapReduce Client将输入数据根据大小切分成M片,并向Master发起提交Job请求;
  • Master收到用户提交Job的请求后,将M(M是输入切片数)个Map Task和R(R是由用户指定的)个Reduce Task分配到空闲的Worker上;
  • 收到Map Task的Worker,把对应于该Task的输入文件读入,并调用用户提供的Map函数对数据进行处理,处理的结果缓存在内存中。Worker会定期把内存中的数据Flush到磁盘上,并且会通过hash(Key)%R的方式,将输出分为R份;
  • 当执行Reduce Task的Worker收到Master的通知,得到了Map Task输出结果的位置后,它就会通过RPC调用把Map Task的输出结果读回来。首先对数据进行排序,然后对相同Key的数据进行归并。这里排序是必要的,因为数据有可能比较大,读入内存的数据只是一小部分,如果不排序的话,没办法将相同Key的数据进行归并及处理;
  • 执行Reduce Task的Worker遍历排序好的中间结果数据,调用用户提供的Reduce函数对数据进行处理,并将处理结果输出到最终的结果文件;
  • 当所有的Map和Reduce Task都执行完成后,Master会通知给用户程序Job执行结束。

Hadoop MapReduce V1

受Google Paper的启发,在Yahoo做搜索引擎的工程师Doug Cutting和Mike Cafarella做出了Yahoo自己的Mapreduce,以及Distributed File System,发展到后来,成了Apache Software Foundation的顶级开源项目,也就是今天大家所熟知的Hadoop, Hadoop系统主要包括两大系统:分布式文件存储系统HDFS,和分布式计算系统MapReduce。HDFS跟Hadoop MapReduce的关系,跟GFS跟Google MapReduce的关系是一样的,它带来的主要好处是数据的高可用,以及MapReduce本身不需要关注数据存放的具体物理位置,很大程度上简化了MapReduce系统的Failover过程。下面我们通过下图来介绍一下Hadoop MapReduce的架构:
MRArch
与Google的MapReduce的结构类似,Hadoop MapReduce也是一种Master/Slave结构。在Hadoop MapReduce系统中,也包含三种不同的角色:一是JobTracker, 与Google MapReduce中的Master对应,负责Job的整体协调与管理;二是TaskTracker,与Google MapReduce中的Worker对应,负责执行具体Map/Reduce Task;三是JobClient,与Google MapReduce中的Client对应,用户通过它来向MapReduce系统提交Job。因为Hadoop MapReduce(V1)与Google MapReduce非常类似,基本的执行流程也是类似的,这里就不再赘述了。

YARN – Hadoop MapReduce V2

我们知道,MapReduce的主要优势在于大规模数据的批量处理(Batch Processing),在很多应用场景下,MapReduce是十分高效的,但是MapReduce并不能解决所有的问题。在现实生活中,还有多种其它的计算场景,与之对应的也出现了不少相应的计算框架,比如流式计算的Storm、迭代计算的Spark、以及图计算的Giraph等。在这样一些场景下,MapReduce就显得没有什么优势了。试想一下,如果用户数据都存储在HDFS中,如果Hadoop本身不支持这些新型的计算框架,那么如果用户要使用这些新型的计算框架,就需要把HDFS中的数据搬到别的存储系统中去,这个开销对于大部分应用来说几乎是不可接受的。因此,在Hadoop上支持除MapReduce之外的其它计算框架是众望所盼的。

以Hadoop MapReduce为例,在传统的MapReduce框架中,会把资源划分为Map Slots和Reduce Slots, 分散在各个TaskTracker中, Map Slots和Reduce Slots是不可相互替代的。这样在实际的执行过程中,就可能会遇到Map Slots用完,而Reduce Slots却空闲,或者Reduce Slots用完,而Map Slots空闲的情况,在这样的情况下,整个Job都无法正常进行。因此,资源的统一调度与管理,资源利用率的提升,对于Hadoop来说也是一个十分迫切的需求。

同样以Hadoop MapReduce为例,我们知道,整个系统是Master/Slave结构,JobTracker是一个中心点,所有用户的Job的提交、后续每个Map/Reduce Task的状态更新及进度管理,都要经过JobTracker, 这样JobTracker要管理的结点是跟所有的Task数正相关的,JobTracker很容易成为整个系统的瓶颈。因此,如何弱化JobTracker这个中心点的功能,减轻其负载,成了提升Hadoop MapReduce系统支持更大规模的集群的关键问题。

基于上面一些主要的考虑点,Hadoop社区开始了下一代MapReduce系统的开发,号称MapReduceV2,也叫YARN(Yet Another Resource Negotiator)。对于YARN和MapReduceV2, 很多初识YARN者会误认为是同一个东东,其实不然。YARN和MapReduceV2完全是两回事,YARN是Hadoop系统的任务与资源管理系统,而MapReduceV2是基于YARN进行重构过的新版的MapReduce计算框架。打个比方,YARN是操作系统,而MapReduceV2刚是装在操作系统上的一个App,这么说就应该比较好理解一些了。接下来,我们来看一下YARN的架构:
YARNArch
从上图我们可以看出,在YARN中,主要包括以下几种角色:

  • ResourceManager: 负责Job的调度、管理,资源的分配、管理的模块。它所管理的单位是Job(更为通用的叫法是Application),不再是具体的Task,因此能比传统的MapReduce支持更大规模的集群;
  • NodeManager:负责执行具体Task的模块。它不再有Slots的概念,取而代之的Container,Task都是通过在NodeManager上启动Container的方式来执行的;
  • ApplicationMaster:由YARN框架提供的一个Libary,每个用户Application(Job)会对应一个ApplicationMaster,在用户提交Application后,ResourceManager会启动该Application对应的ApplicationMaster, 并把ApplicationMaster的地址反馈给客户端,后续客户端直接跟ApplicationMaster进行交互。ApplicatoinMaster负责向ResourceManager申请执行用户Task所需要的资源,以及管理用户Application中每一个Task的运行情况;
  • Container:抽象出来的资源集合的概念,它代表由ResouceManage授予给Application的资源,包括CPU、内存等。最终用户Task都是通过Container来执行的;
  • Client:负责向ResourceManager提交Application(Job)请求,并从ApplicationMaster获取执行结果。

通过上面的介绍,相信大家应该对YARN有了初步的了解,下面我们来看一下在YARN中是如何提交、执行Application(Job)的:

  • 用户通过Client向ResourceManager提交Application,ResourceManager根据用户的请求,分配一个合适的Container,然后在指定的NodeManager上启动该Container运行ApplicationMaster;
  • ApplicationMaster在NodeManager上启动后,向ResourceManager注册自己;
  • ApplicationMaster跟ResourceManager协商、申请用户Task所需要的Container, 申请到后ApplicationMaster把Container描述发给指定的NodeManager,NodeManager启动Container,运行用户Task;
  • 用户Task在Container中执行的过程中,会定期向ApplicationMaster汇报执行的进度、状态等信息;
  • 在执行过程中,Client可以直接跟ApplicationMaster通信,获取整个Application执行的进度、状态等信息;
  • 所有的Task执行结束后,整个Application执行结束,ApplicationMaster会向ResourceManager注销自己,释放资源,并退出运行。
分类: BigData, MapReduce, YARN 标签: , ,
  1. 2014年2月28日14:53 | #1

    路过来看看。欢迎回访

  2. DHL
    2014年11月7日09:20 | #2

    官网的原话是:MapReduce has undergone a complete overhaul in hadoop-0.23 and we now have, what we call, MapReduce 2.0 (MRv2) or YARN. 你还跟我说它们完全是两个东西?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.