读论文Google-MapReduce

江湖永流传:谷歌技术有“三宝”,GFS,MapReduce和大表(BigTable)!
作为一名大数据兼计算机外行人,读完了Google-MapReduce这篇论文后萌生了一点小感悟(实则拙见)。这其中包括我参考了一些大佬们的形象讲解渐渐顿悟的自我感受和所读论文的大体内容。

论文大体内容

什么是MapReduce

MapReduce 是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一
个 Map 函数处理一个基于 key/value pair 的数据集合,输出中间的基于 key/value pair 的数据集合;然后再创建
一个 Reduce 函数用来合并所有的具有相同中间 key 值的中间 value 值。作为非计算机专业学生看到这我也很无奈,那它到底是什么呢。首先让我们参看了一个例子,假如需要统计某个等级的网易云音乐的听歌的歌曲排行以便分析出这个等级的用户的风格偏好该怎么办?
方法一:可以编写一个小程序来一个个遍历数据然后统计不同歌曲被播放的次数,然后简单的排序就好了。
这种方法对于数据很少的时候是非常吃香的,比如班级点名。但是像某段时间一个范围内用户听歌排行就很不友好了。
方法二:把大的数据包分成几块,用多个程序去做。这个方法比上一个好,但是一台计算机的资源是有限的,你总不希望游戏本卡成机房机吧。
方法三:将方法二改进用一个计算机集群去做。把很大的数据split成M个数据blocks,集群中计算机主要有两大工作,map函数和reduce函数的执行。集群中有一个master,由它将这M个数据包分配给集群中的worker处理,然后输出中间的基于 key/value pair 的数据集合,再由master调配给另一小部分worker来执行reduce函数对所有的具有相同中间 key 值的中间 value 值进行合并,达到并行运算的目的减少了运算时间。所以说它是一个处理和生成超大数据的算法的编程模型。就像是一根大通道U形管道,能够接收超大量的数据并且在短时间内能得到结果。模型描述:利用一个输入 key/value pair 集合来产生一个输出的 key/value pair 集合。
当然啦更专业一点的应用例子应该是论文中提到的:
分布式的 Grep,计算 URL 访问频率,倒转网络链接图,分布式排序。
说了这么多让我们看一看Mapreduce的真面目(Google-MapReduce中的专业过程)

mapreduce的实现

读论文Google-MapReduce_第1张图片

谷歌mapreduce论文中的专业执行描述):

首通过将 Map 调用的输入数据自动分割为 M 个数据片段的集合,Map 调用被分布到多台机器上执行。输和入的数据片段能够在不同的机器上并行处理。使用分区函数将 Map 调用产生的中间 key 值分成 R 个不同分。

  1. 用户程序首先调用的 MapReduce 库将输入文件分成 M 个数据片度,每个数据片段的大小一般从
    16MB 到 64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在机群中创建大量
    的程序副本。
  2. 这些程序副本中的有一个特殊的程序–master。副本中其它的程序都是 worker 程序,由 master 分配
    任务。有 M 个 Map 任务和 R 个 Reduce 任务将被分配,master 将一个 Map 任务或 Reduce 任务分配
    给一个空闲的 worker。
  3. 被分配了 map 任务的 worker 程序读取相关的输入数据片段,从输入的数据片段中解析出 key/value
    pair,然后把 key/value pair 传递给用户自定义的 Map 函数,由 Map 函数生成并输出的中间 key/value
    pair,并缓存在内存中。
  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 的输出存放在 R 个输出文件中(对应每个 Reduce 任务产生一个输出
    文件,文件名由用户指定)。一般情况下,用户不需要将这 R 个输出文件合并成一个文件–他们经常把这些文
    件作为另外一个 MapReduce 的输入,或者在另外一个可以处理多个分割文件的分布式应用中使用.

总的思想就是依靠机海战术,对一个任务进行并行计
算靠足够多的机器资源来很快的给出答案,mapreduce的大体思想就是这么一个处理超级大数据量的模型了。

mapreduce中我比较感兴趣的问题

上述执行过程之后论文还说了一列类详细问题,其中有一小部分是我比较感兴趣的。就来说说我觉得比较有趣的吧。关于master和worker的失效问题。(the teacher say…in the class)在一个很大的计算机集群中包含有成千上万台普通性能甚至次之的计算机,这么多的计算机出现宕机是很常见,所以需要考虑如何处理这种情况。对于挂掉的worker可以把它没做完的工作分给其他机器。那如果是master挂掉了呢?然后再选一个master,这是我觉的特别有趣的,机器之间居然会根据综合评价来选举Amazing。另一个问题是关于“落伍者”,经常会由那么一两个worker由于资源和bug问题在大部分worker已经完成map任务时还没执行完,拖慢进度。这里处理是在其他的计算机都执行完了以后会出现备用仍无来处理没做完的。有点像是小伙伴作业都做完了而你还没有,为了一起玩,他们就来一起很快的帮你完成作业再一起愉快的玩耍。

收尾前的读后感

读了这篇论文我大体上了解了计算机上的并行运算,通过增加机器来达到提高效率的目的。正如老师说的在这个时代最富有的资源是数据,随着人类改造世界的社会活动的进行,数据只增不减,应用好数据来造福人类的前提就是处理数据了,只有拥有足够的能力去才能有效率的去处理数据。这应该也是mapreduce出现的原因吧,由于大量的数据传统的方法无法处理也就出现了这样的一个处理超大数据的模型。这也是一种把大的工作分化成一个一个小的问题然后并行处理了,日常生活中处处是这种例子。而让我感兴趣的是这种以许多次抗优的想法。通过结合许多太次级计算机的资源合成一部巨型处理机。解决问题通过这种一级一级的合成达到一个很高的处理水平,应该是能应用到任何领域的。
我想虽然我并不是计算机领域或者大数据方向的学生,但是我依旧能用mapreduce的思想来创造关于我专业领域未知的奇迹。比如一些科研方面,一些数据分析方面,如果把这种拆分+并行处理的ideal就加进去可能会更有帮助。一千个人手上有1000个mapreduce的用法。所以我觉得读了一篇mapreduce虽然没有读透懂,但是也是受益匪浅的。

最后的最后

由于我并非有更深理解所以用词方面比较口头些,还有一些理解偏差,所以本文应以一种质疑的眼光看待。如有错误乐于受教!

参考文献

Google MapReduce 中文版

你可能感兴趣的:(论文阅读)