论坛首页 Java企业应用论坛

什么是MapReduce?

浏览 18777 次
精华帖 (0) :: 良好帖 (11) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-12   最后修改:2010-07-12
1、MapReduce来龙去脉

MapReduce是一个说难懂也难懂、说好懂也好懂的概念。
说它难懂,是因为,如果你只理论上的去学习、去理解,确实很难懂。
说它好懂,是因为,如果你亲手在hadoop运行过几个MapReduce的job,并稍微学点hadoop的工作原理,基本上也就理解MapReduce的概念了。

所以,有句话说的特别好:“如果将编程比作运动的话,那么它绝对不是表演项目,而是竞技项目。”(摘自《Erlang程序设计》第10页)

但是,在这里,我还是想向不了解MapReduce的同学们介绍一下MapReduce。
MapReduce借用了函数式编程的概念,是google发明的一种数据处理模型。因为google几乎爬了互联网上的所有网页,要为处理这些网页并为搜索引擎建立索引是一项非常艰巨的任务,必须借助成千上万台机器同时工作(也就是分布式并行处理),才有可能完成建立索引的任务。

所以,google发明了MapReduce数据处理模型,而且他们还就此发表了相关论文


后来,Doug Cutting老大就根据这篇论文硬生生的复制了一个MapReduce出来,也就是今天的Hadoop。如果没听说过hadoop,请参考《hadoop扫盲篇》


2、MapReduce工作过程

知道了MapReduce是分布式数据处理编程模型后,下面我们看看它是怎么工作的。

MapReduce处理数据过程主要分成2个阶段:map阶段和reduce阶段。先执行map阶段,再执行reduce阶段。

1) 在正式执行map函数前,需要对输入进行“分片”(就是将海量数据分成大概相等的“块”,hadoop的一个分片默认是64M),以便于多个map同时工作,每一个map任务处理一个“分片”。
2) 分片完毕后,多台机器就可以同时进行map工作了。
   map函数要做的事情,相当于对数据进行“预处理”,输出所要的“关切”。
   map对每条记录的输出以<key,value> pair的形式输出。
3) 在进入reduce阶段之前,还要将各个map中相关的数据(key相同的数据)归结到一起,发往一个reducer。这里面就涉及到多个map的输出“混合地”对应多个reducer的情况,这个过程叫做“洗牌”。
4) 接下来进入reduce阶段。相同的key的map输出会到达同一个reducer。
   reducer对key相同的多个value进行“reduce操作”,最后一个key的一串value经过reduce函数的作用后,变成了一个value。


上面粗略的介绍了MapRedcue。来发张图,更有利于理解:

上图来自《Hadoop The Definitive Guide》


*** THE END ***

  • 大小: 44.1 KB
   发表时间:2010-07-13  
希望多多介绍下Hadoop的应用及原理呀
0 请登录后投票
   发表时间:2010-07-13  
huochai2009 写道
希望多多介绍下Hadoop的应用及原理呀


感谢关注,我会努力的
0 请登录后投票
   发表时间:2010-07-13  
MapReduce 应用场景 除啦搜索外还有哪些
0 请登录后投票
   发表时间:2010-07-13  
最近发现大家对Hadoop比较热衷啊
0 请登录后投票
   发表时间:2010-07-13  
dilantaya 写道
MapReduce 应用场景 除啦搜索外还有哪些


推荐一个PPT,里面列了几个实例。

另外,可以参考:Who Uses Hadoop?
0 请登录后投票
   发表时间:2010-07-13  
hadoop的一个分片默认是64M,那么对于一个记录行形式的文本,64M大小的切分会不会将一个记录给破坏掉?hadoop是怎么进行文本大文件的切分,是按行读取,然后然后尽可能的接近64M吗?楼主能否解惑下,感谢!
0 请登录后投票
   发表时间:2010-07-13  
superwind 写道
hadoop的一个分片默认是64M,那么对于一个记录行形式的文本,64M大小的切分会不会将一个记录给破坏掉?hadoop是怎么进行文本大文件的切分,是按行读取,然后然后尽可能的接近64M吗?楼主能否解惑下,感谢!


如果,记录行非常长的话,那么在HDFS上,就有可能一个数据行被分割成2个block存储。

但是map的输入分片则不会将一行记录打断。

综合上面两句话,结论是:遇到这种情况,那么map的task,有可能会从其他的datanode上读取那“半行”数据。

《Hadoop.The.Definitive.Guide》上面有个图,很好的说明了这一点:



另外,输入分片时,不是按行号分的,而是按照字符的偏移量。
  • 大小: 11.9 KB
0 请登录后投票
   发表时间:2010-07-13  
lz有没有mapreduce做分布式索引的相关经验?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics