读Google MapReduce后有感

本来读Google MapReduce是老师布置的任务,但是第一我是那种要么就不做事要么就要把事做好的人,第二我本来就有意向向大数据方向发展所以好好的看了一下论文,发现我现在的水平还是不行,感觉论文读起来晦涩难懂很多地方不清楚。而我也查了许多资料来去了解MapReduce,发现其实MapReduce的底层原理其实并不是很复杂,接下来我就谈一谈论文里的要点和我的一些看法和感想。

论文要点

介绍

第一段介绍说了为什么要开发这个编程模型,在作者开发模型前Google的程序员每天要处理海量的数据,如文章的抓取,web请求日志,还有计算处理各种类型的衍生数据,如倒排索引,web文档的图结构的各种表示形势、每台主机上网络爬虫抓取的页面数量的汇总、每天被请求的最多的查询的集合等等。而这些数据处理其实并不困难在概念上,但是由于数据量太过于庞大而导致这样的简单问题的数据处理也变得很困难,并且只能将数据分布在成百上千的主机上完成.

而为了解决上述的问题,作者计划设计一个新的抽象模型,使用这个抽象模型可以抽象出并行计算、容错、数据分布、负载均衡等复杂问题,而使使用者只需要关心想要执行的简单运算(计算机领域的抽象思维起了大作用)。

编程模型

MapReduce对于使用者就像一个数据通道,数据从这边进去在比较短的时间内(如果你的计算机数量足够多的话)在另一端会出来已经处理过的数据了。而实现原理我就不细讲了(细讲我也讲不清楚)大体是用户把数据传入然后MapReduce库先把文件划分为很多份然后再产生一个key/value pair的集合,随后将集合传递给reduce函数而用户自定义的reduce函数数调用只产生 0 或 1 个输出 value 值。通常我们通过一个迭代器把中间 value 值提供给 Reduce 函数,这样我们就可以处理无法全部放入内存中的大量的 value 值的集合。

以下为转载的v_JULY_v的文章MapReduce技术的初步了解与学习

举例说明


  相信几乎没有人喜欢看一堆只写概念的文章。本文将通过实例来充分解释清楚MapReduce这个模型。


  先从最最简单的例子说起吧。假设我们有一组数据:1,2,3,…,100。求这一组数据的平方和。现在我们用MapReduce这个模型解决这一个问题。


  首先我们把这组数据分成100份,交由100台处理器去处理。每一台处理器只做一件事,就是把自己要处理的数据平方一下。这样一来,最初的那组数[1,2,3,…,100]就被映射成了[1,4,9,16,…,10000]了。这就是所谓的Map操作。而Reduce操作呢?Reduce操作就是把映射后得到的这100个新的数据累加咯,这不就得到结果了吗?


  这个例子太简单了吧,不过它的确说明了MapReduce的本质思想:先把要处理的数据分成n多个小块,然后交由n多个处理器处理,最后再通过一定的手段进行数据汇总,得出答案。


  换个例子吧。这次这个例子是几乎所有讲MapReduce的文章都会讲到的一个例子:单词计数。假设有3篇文章,分别为:


Paper1: We study algorithm.


Paper2: We share our thinking.


Paper3: This team shares thinking of algorithm.


根据MapReduce的模型,将这3篇文章交由3台处理器单独处理:


Map操作:




处理之后对中间结果进行一定处理:(注意:此步骤仍然是用多台处理器分别完成)



最后进行汇总,即Reduce操作:


                  

这样,3篇文章的所有词频不就处理完了吗?还是很简单吧。

实现

MapReduce的实现

  1. 用户程序首先调用的 MapReduce 库将输入文件分成 M 个数据片度,每个数据片段的大小一般从16MB 到 64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在机群中创建大量的程序副本。
  2. 这些程序副本中的有一个特殊的程序–master。副本中其它的程序都是 worker 程序,由 master 分配任务。有 M 个 Map 任务和 R 个 Reduce 任务将被分配,master 将一个 Map 任务或 Reduce 任务分配给一个空闲的 worker。
  3. 被分配了 map 任务的 worker 程序读取相关的输入数据片段,从输入的数据片段中解析出 key/valuepair,然后把 key/value pair 传递给用户自定义的 Map 函数,由 Map 函数生成并输出的中间 key/valuepair,并缓存在内存中。
  4. 缓存中的 key/value pair 通过分区函数分成 R 个区域,之后周期性的写入到本地磁盘上。缓存的key/value pair 在本地磁盘上的存储位置将被回传给 master,由 master 负责把这些存储位置再传送给Reduce worker。
  5. 当 Reduce worker 程序接收到 master 程序发来的数据存储位置信息后,使用 RPC 从 Map worker 所在主机的磁盘上读取这些缓存数据。当 Reduce worker 读取了所有的中间数据后,通过对 key 进行排序后使得具有相同 key 值的数据聚合在一起。由于许多不同的 key 值会映射到相同的 Reduce 任务上,因此必须进行排序。如果中间数据太大无法在内存中完成排序,那么就要在外部进行排序。
  6. Reduce worker 程序遍历排序后的中间数据,对于每一个唯一的中间 key 值,Reduce worker 程序将这个 key 值和它相关的中间 value 值的集合传递给用户自定义的 Reduce 函数。Reduce 函数的输出被追加到所属分区的输出文件。
  7. 当所有的 Map 和 Reduce 任务都完成之后,master 唤醒用户程序。在这个时候,在用户程序里的对MapReduce 调用才返回。

MapReduce的容错

master会周期性的ping每个worker,如果在一个周期中没有收到worker的消息就标记为失效,并把他的任务分配给其他的worker。而对于master失效的方法MapReduce没有太好的解决方法,作者是周期性的将信息写入磁盘,如果失效了就让用户重新启动MapReduce。

MapReduce的存储位置

由于使用的机器是普通的计算机所以网络带宽是很缺乏的,MapReduce为了能处理这个问题使用了两办法,第一是每份要处理的数据被分的比较小只有64MB传输比较方便,并且MapReduce 的 master 在调度 Map 任务时会考虑输入文件的位置信息,尽量将一个 Map 任务调度在包含相关输入数据拷贝的机器上执行。这样大部分的数据都会从本地的机器读取,因此消耗非常少的网络带宽。

MapReduce的备用任务

有一句谚语说的好“一只木桶能盛多少水,并不取决于最长的那块木板,而是取决于最短的那块木板。也可称为短板效应。”而MapReduce也面临这这样的问题,影响一个 MapReduce 的总执行时间最通常的因素是“落伍者”:在运算过程中,如果有一台机器花了很长的时间才完成最后几个 Map 或 Reduce 任务,导致 MapReduce 操作总的执行时间超过预期。而MapReduce使用一个在任务即将完成时启动备用的任务进程来执行剩下的,处于处理中的任务,而对于这些有多个进程的任务只要有一个完成了都会被标记为完成。

MapReduce的技巧

对于MapReduce的技巧我在这里就不多赘述了有兴趣的可以去看Google的论文

MapReduce的性能

对于数据的分析我不是行家,甚至连入门都没有再加上Google的论文的分析已经够详细了所以我在这里就不多赘述了,我在这里只想谈一点。就是在关闭了备用任务排序程序后程序的执行情况是在960秒之后只有5个Reduce任务没有完成但是这五个任务又执行了300秒才完成,导致整个计算消耗了1283秒,多了44%的执行时间。这是很可怕的因为五个任务而浪费掉了300秒的时间,所以说备用任务的设置是很有必要的。

MapReduce的经验

介绍了MapReduce的应用,现在MapReduce已经应用到了

  1. 大规模机器学习问题
  2. Google Newe和Froogle产品的集群问题
  3. 从公众查询产品(比如 Google 的 Zeitgeist)的报告中抽取数据。
  4. 从大量的新应用和新产品的网页中提取有用信息(比如,从大量的位置搜索网页中抽取地理位置信息)。
  5. 大规模的图形计算。
  6. 大规模的索引

MapReduce的相关工作

在相关工作中作者给出了MapReduce在实现的过程中的技术是收到了那些技术的启发,以及在应用时对原技术进行了那些改进,或者是与原技术有什么不同。

感想

首先在读这篇论文之前我看过许多资料我推荐一篇资料给大家参考文章是fumin发表在csdn上的谷歌技术"三宝"之MapReduce链接其中提到了谷歌的GFS技术和BigTable技术,这两个技术我也就不多讲了,你只需要知道MapReduce技术是来配合这两个技术的。而这三个技术的开源实现就是Hadoop,而MapReduce技术是如何来配合其他的两个技术的呢?其实GFS和BigTable已经为我们提供了高性能、高并发的服务,但是并行编程可不是所有程序员都玩得转的活儿,如果我们的应用本身不能并发,那GFS、BigTable也都是没有意义的。MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。而我觉得MapReduce的实现就是我们计算机领域对问题的抽象,对复杂问题的拆分的这种思想的体现。比如说我在数学之美里看到的Google大脑就是一种大规模的并行处理的人工神经网络,这里恰好和我们的MapReduce的思想很符合,并行处理一看就知道很符合,其实还有人工神经网络也是的,对神经网络有了解的人应该知道神经网络的原理其实很简单就是一种很特殊的有向图,而这种有向图就是对复杂问题的拆分的思想。其实看待我们现在社会的趋势就是信息化,大数据化,数据已经成为了一种新的资源并且这个资源要大量的才有意义,未来的社会是一个算力缺乏的时代不光是人工智能,自动驾驶和终端的去计算化还是海量的大数据的处理,还有随着科学技术的发展,许多科研工作者越来越清楚地认识到“计算”已经成为与理论分析和实验并列的第三种科学研究手段,许多科研工作已无法离开高性能计算机的支持,这些都导致了计算资源的不足。并且由于量子隧穿效应摩尔定律已经快要失效了,而能大幅度提高算力的方法如量子计算,生物计算还都离实际应用很远,所以未来我们计算机领域可能会是软件方面使用更好的算法更好的技术去进一步的简化问题压缩解决问题所需要的算力或是开发如Hadoop这样的并行计算处理工具,而硬件方面应该是积极的去寻找能提高CPU性能的方法。而并行计算可能就是在未来一段时间在算力没有大的提升的唯一的解决方法,而且我们计算机领域最新的技术发展基本上和大数据有关而大数据的处理又依赖于云计算的并行计算,所以我们学科的未来一段时间的发展重点就应该是并行计算技术的优化和进步。

参考资料

  1. Google MapReduce中文版
  2. fumin的谷歌技术"三宝"之MapReduce
  3. 王鹏的《并行计算应用及实践》

你可能感兴趣的:(大数据)