由于cnblogs的代码着色系统不支持erlang,所以就直接从博客上贴过来了,如果大家看的不习惯的话,就直接来我的博客上看吧

本文章为本人个人博客相应文章的镜像:

原文地址: http://www.greatony.com/index.php/2010/03/21/mapreduce-algorithm-implemented-in-erlang-i/

 Google曾经发过3篇引起巨大反响的论文:

  1. The Google File System
  2. MapReduce: Simplified Data Processing on Large Clusters
  3. Bigtable: A Distributed Storage System for Structured Data

这三篇论文对于大规模并行计算这个领域,无疑是三颗“小男孩”,就是在这三篇论文的基础上,有了著名的开源项目Apache Hadoop
GFS是一个高性能、分布式、高可靠的文件存储系统,MapReduce是一种在大规模集群上,进行高效的并行计算的方法,而BigTable类似于分布式的数据库系统。

在本文中,我们讨论MapReduce算法的思想,以及如何在Erlang中实现一个简单、高效、可靠的MapReduce算法。

MapReduce算法

MapReduce算法讲大规模计算的过程分成了两个阶段:

  1. Map阶段:在这个阶段,通过Map过程,将原始数据列表,处理成中间数据,用于Reduce过程的处理
  2. Reduce阶段:将Map阶段产生的中间数据综合归纳成输出结果

这样说起来似乎比较抽象,我们用一个实例(好像是mr论文里面的例子,otz)来说明这个过程:
任务:我们现在有200篇文章,我们需要统计这200篇文章中,每一个英文单词都出现了几次。
Map阶段:这个阶段是分别针对每一篇文章的,统计出这一篇文章中,每个单词出现了几次。它的运算结果类似这样:
在第1篇文章中:找到了hello * 1, world * 1
在第2篇文章种:找到了hello * 1, tony * 1, huang * 1
...
Reduce阶段:这个阶段就是将上面的中间结果进行综合,它的运算结果类似这样:
在所有文章中,一共有:hello * 2, tony * 1, world * 1, huang * 1
所以,我们就会发现,我们很容易将Map过程分配到不同的计算机上执行(最简单的,每台机器计算一篇文章),而对于Reduce阶段也可以并行化(比如第一台机器Reduce1~4篇文章的数据,第二台机器Reduce5~8篇文章的数据,最后通过递归的reduce过程就可以把所有文章的数据整合在一起了)。
所以,这个算法非常有利于对巨大的数据的并行化处理(paper的副标题里就这么写的嘛)

Erlang实现 - 原型1

罗唆了那么久,终于讲到该如何实现这个算法了。
好了,首先,我们直接根据MapReduce的思想,利用erlang内置的lists库的函数来实现这个功能,代码如下:

1 map_reduce(MapReduceSource) ->
2     MapResult=lists:map(MapSource),
3     lists:foldl(Reduce, [], MapResult).

相关文章:

  • 2022-12-23
  • 2021-09-16
  • 2022-01-24
  • 2021-04-30
  • 2022-12-23
  • 2022-01-18
  • 2022-01-26
  • 2021-10-09
猜你喜欢
  • 2022-01-24
  • 2021-07-13
  • 2022-12-23
  • 2022-12-23
  • 2021-07-31
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案