粗粒度解读MapReduce

什么是MapReduce?

单机计算的局限性以及分布式计算需要解决哪些问题

在介绍MapReduce定义之前我们首先要了解到单机计算的局限性和分布式计算需要解决哪些问题,这有助于我们理解MapReduce是一个多么伟大的创新。

  • 单机计算的局限性:磁盘受限,一台计算机的存储容量达到50T就以及算是大容量了,就目前企业中产生的数据量来看,单台计算机的磁盘容量远远无法满足企业的存储需求;内存受限,单台计算机的内存同样无法满足计算需求;计算能力受限,数据计算需要占用CPU,单台计算机的CPU是线性运行的,这意味着数据只能一条一条的进行计算,以腾讯2019年大数据平台的计算量为例,其日数据计算量超30万亿,试想单台计算机要达到怎样的性能才能满足其计算需求。
  • 分布式计算需要解决哪些问题:
  1. 运算逻辑至少要经历两个阶段:并行计算阶段和结果汇总阶段,那么这两个阶段要如何启动,如何协调?
  2. 运算程序到底要怎么执行,是数据向计算移动还是计算向数据移动?
  3. 如何分配运算任务,如何管理运行状态?
  4. 如何管理中间状态,如何容错,如何监控?
  5. 程序执行错误该如何重试,会不会产生重复计算的问题?
    可见在程序由单机版扩成分布式版时,会引入大量的复杂工作。为了提高开发效率,能否将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑?当然能,答案就是MapReduce。

MapReduce定义

1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。
2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。
3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。

MapReduce的由来

2003年和2004年,Google公司在国际会议上分别发表了两篇关于Google分布式文件系统和MapReduce的论文,公布了Google的GFS和MapReduce的基本原理和主要设计思想。Google的那篇MapReduce论文里说:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。这句话提到了MapReduce思想的渊源,大致意思是,MapReduce的灵感来源于函数式语言(比如Lisp)中的内置函数map和reduce。简单来说,在函数式语言里,map表示对一个列表(List)中的每个元素做计算,reduce表示对一个列表中的每个元素做迭代计算。它们具体的计算是通过传入的函数来实现的,map和reduce提供的是计算的框架。我们就可以把MapReduce理解为,把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。Map面对的是杂乱无章的互不相关的数据,它解析每个数据,从中提取出key和value,也就是提取了数据的特征。经过MapReduce的Shuffle阶段之后,在Reduce阶段看到的都是已经归纳好的数据了,在此基础上我们可以做进一步的处理以便得到结果。

MapReduce的架构

粗粒度解读MapReduce
MapReduce(2.0)通过YARN来实现资源调度,架构中主要有以下几个角色:

  • Client:与YARN进行交互,提交MapReduce作业,查询作业运行状态以及管理作业等。
  • ResourceManager:负责任务管理与资源调度及监视,以及当MR APPMatser挂掉之后,重启MR APPMatser,默认重启2次。
  • MRAppMaster:任务划分、向ResourceManager汇报心跳、资源申请并将其二次分配给Map Task和Reduce Task、任务状态监控和容错。
  • NodeManager:主要负责启动ResourceManager分配给MRAppMaster的container以及代表MRAppMaster的container,并且会监视container的运行情况。

MapReduce的内部逻辑

粗粒度解读MapReduce
MapReduce的内部逻辑如上图所示。inputformat从hdfs上读取split进行解析,然后输出给mapTask。map阶段的输出写在磁盘上。Partitioner阶段将不同的map结果合理的分配到相应的ReduceTask。最后,通过Outputformat将结果写到HDFS上。

MapReduce的容错机制

这里仅对MapReduce的容错机制进行粗粒度的解读,详细介绍可以参考qiruiduni的博文

  • Task Failure
    最常见的task 失败是在map或reduce task中的用户代码抛出一个运行时异常。如果发生这种情况,JVM在退出之前将向父application master报告一个错误,错误最终会被写进用户的日志中。application master将task标记为失败,并且释放container,以便其资源可用于其它的task。当application master被告知一个task已经失败,那么它会重新调度执行task。application mastet会尽量避免在之前失败的同一个节点上重新调度task。

  • Application Master Failure
    如果MapReduce application master失败会重新尝试运行。尝试运行MapReduce application master的最大次数是由mapreduce.am.max-attempts属性控制的,默认值为2。所以如果一个MapReduce application master失败了两次,那么它将不会被再次尝试,MapReduce Job将失败。如果resource manager 检测到失败的事件,会在一个新的container重新启动一个application master的实例(由node manager管理)。对于新的MapReduce application master来说,它会根据已失败的application运行的job的历史记录来恢复task的状态,所以不需要重新运行它们。恢复默认是启用的,但可以通过设置yarn.app.mapreduce.am.job.recovery.enable属性值为false禁用它。

  • Node Manager Failure
    如果一个node manage节点因中断或运行缓慢而失败,那么它将不会发送心跳到resource manager(或者发送次数较少)。如果resource manage在10分钟内(这个配置可以通过yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms属性设置,以毫秒为单位)没有接收到一个心跳,它会感知到node manager已经停了,并把它从节点集群中移除。对于出现故障的node manager节点,application master分配在其上已经成功运行完成的map task,如果这些map task属于未完成的Job,它们将会被重新运行,因为它们的中间输出存放在故障node manager节点的本地文件系统中,reduce task可能不能访问。

  • Resource Manager Failure
    Resource manager出现故障是比较严重的,因为没有它,job 和 task都不能被启动。默认配置,resource manager是一个单点故障,因为在机器出现故障时,所有的job都会失败,并且不能被恢复。为了实现高可用(HA),有必要以一种active-standby(活动-备用)配置模式运行一对resource manager。如果活动的resource manager出现故障,备用的resource manager可以很开的接管,并且对客户端来说没有明显的中断现象。

MapReduce数据本地化

上面我们问了一个问题,执行任务时,是数据向计算移动还是计算向数据移动?这就引出了MapReduce的另一个特性:数据本地性。如果任务运行在它将处理的数据所在的节点,则称该任务具有“数据本地性”(例如wordcount)。当我们的YARN拿到block的spilt切片信息时,会优先将task往最近的副本存放位置分配,因为一个block通常有多个副本,为了减小由数据传输所带来的风险和减少数据传输的时间。其实这就是计算向数据传输。数据本地性可避免跨节点或机架数据传输,提高运行效率 。其优先级为本节点>本机架>其他。

总结

MapReduce的推出给大数据并行处理带来了巨大的革命性影响,使其已经成为事实上的大数据处理的工业标准。尽管MapReduce还有很多局限性,但人们普遍公认,MapReduce是到最为成功、最广为接受和最易于使用的大数据并行处理技术。MapReduce的发展普及和带来的巨大影响远远超出了发明者和开源社区当初的意料,以至于马里兰大学教授、2010年出版的《Data-Intensive Text Processing with MapReduce》一书的作者Jimmy Lin在书中提出:MapReduce改变了我们组织大规模计算的方式,它代表了第一个有别于冯·诺依曼结构的计算模型,是在集群规模而非单个机器上组织大规模计算的新的抽象模型上的第一个重大突破,是到所见到的最为成功的基于大规模计算资源的计算模型。