能不能解释一下hadoop中的mapreduce

chengh06
  • 104

现在要完成一项海量数据处理的工作。
大约有500G的.gz log文件
现在要从log中提取一些信息做统计工作~
因为文件太大,所以打算用hadoop来做。
现在已经安装了hadoop,然后需要自己写mapreduce
打算用脚本来写,比如shell,python。
可是因为刚入手,所以对mapreduce不是很理解。
不知哪位高手能用生动的语言解释一下什么事mapreduce,对于我这个问题来说,mapreduce有分别起到什么作用呢?

回复
阅读 12.5k
7 个回答
✓ 已被采纳

印度Java程序员Shekhar Gulati在自己的博客发表了“How I explained MapReduce to my Wife?”一文,比较通俗地阐述了MapReduce的概念。

昨天,我在Xebia印度办公室发表了一个关于MapReduce的演说。演说进行得很顺利,听众们都能够理解MapReduce的概念(根据他们的反馈)。我成功地向技术听众们(主要是Java程序员,一些Flex程序员和少数的测试员)解释了MapReduce的概念,这让我感到兴奋。在所有辛勤的工作之后,我们在Xebia印度办公室享用了丰盛的晚餐,然后我径直回了家。

回家后,我的妻子(Supriya)问道:“你的会开得怎么样?”我说还不错。接着她又问我会议是的内容是什么(她不是从事软件或编程领域的工作的)。我告诉她说MapReduce。“Mapduce,那是什么玩意儿?”她问道: “跟地形图有关吗?”我说不,不是的,它和地形图一点关系也没有。“那么,它到底是什么玩意儿?”妻子问道。 “唔…让我们去Dominos(披萨连锁)吧,我会在餐桌上跟你好好解释。” 妻子说:“好的。” 然后我们就去了披萨店。

我们在Domions点餐之后,柜台的小伙子告诉我们说披萨需要15分钟才能准备好。于是,我问妻子:“你真的想要弄懂什么是MapReduce?” 她很坚定的回答说“是的”。 因此我问道:

我: 你是如何准备洋葱辣椒酱的?(以下并非准确食谱,请勿在家尝试)

妻子: 我会取一个洋葱,把它切碎,然后拌入盐和水,最后放进混合研磨机里研磨。这样就能得到洋葱辣椒酱了。

妻子: 但这和MapReduce有什么关系?

我: 你等一下。让我来编一个完整的情节,这样你肯定可以在15分钟内弄懂MapReduce.

妻子: 好吧。

我:现在,假设你想用薄荷、洋葱、番茄、辣椒、大蒜弄一瓶混合辣椒酱。你会怎么做呢?

妻子: 我会取薄荷叶一撮,洋葱一个,番茄一个,辣椒一根,大蒜一根,切碎后加入适量的盐和水,再放入混合研磨机里研磨,这样你就可以得到一瓶混合辣椒酱了。

我: 没错,让我们把MapReduce的概念应用到食谱上。Map和Reduce其实是两种操作,我来给你详细讲解下。

Map(映射): 把洋葱、番茄、辣椒和大蒜切碎,是各自作用在这些物体上的一个Map操作。所以你给Map一个洋葱,Map就会把洋葱切碎。 同样的,你把辣椒,大蒜和番茄一一地拿给Map,你也会得到各种碎块。 所以,当你在切像洋葱这样的蔬菜时,你执行就是一个Map操作。 Map操作适用于每一种蔬菜,它会相应地生产出一种或多种碎块,在我们的例子中生产的是蔬菜块。在Map操作中可能会出现有个洋葱坏掉了的情况,你只要把坏洋葱丢了就行了。所以,如果出现坏洋葱了,Map操作就会过滤掉坏洋葱而不会生产出任何的坏洋葱块。

Reduce(化简):在这一阶段,你将各种蔬菜碎都放入研磨机里进行研磨,你就可以得到一瓶辣椒酱了。这意味要制成一瓶辣椒酱,你得研磨所有的原料。因此,研磨机通常将map操作的蔬菜碎聚集在了一起。

妻子: 所以,这就是MapReduce?

我: 你可以说是,也可以说不是。 其实这只是MapReduce的一部分,MapReduce的强大在于分布式计算。

妻子: 分布式计算? 那是什么?请给我解释下吧。

我: 没问题。

我: 假设你参加了一个辣椒酱比赛并且你的食谱赢得了最佳辣椒酱奖。得奖之后,辣椒酱食谱大受欢迎,于是你想要开始出售自制品牌的辣椒酱。假设你每天需要生产10000瓶辣椒酱,你会怎么办呢?

妻子: 我会找一个能为我大量提供原料的供应商。

我:是的..就是那样的。那你能否独自完成制作呢?也就是说,独自将原料都切碎? 仅仅一部研磨机又是否能满足需要?而且现在,我们还需要供应不同种类的辣椒酱,像洋葱辣椒酱、青椒辣椒酱、番茄辣椒酱等等。

妻子: 当然不能了,我会雇佣更多的工人来切蔬菜。我还需要更多的研磨机,这样我就可以更快地生产辣椒酱了。

我:没错,所以现在你就不得不分配工作了,你将需要几个人一起切蔬菜。每个人都要处理满满一袋的蔬菜,而每一个人都相当于在执行一个简单的Map操作。每一个人都将不断的从袋子里拿出蔬菜来,并且每次只对一种蔬菜进行处理,也就是将它们切碎,直到袋子空了为止。

这样,当所有的工人都切完以后,工作台(每个人工作的地方)上就有了洋葱块、番茄块、和蒜蓉等等。

妻子:但是我怎么会制造出不同种类的番茄酱呢?

我:现在你会看到MapReduce遗漏的阶段---搅拌阶段。MapReduce将所有输出的蔬菜碎都搅拌在了一起,这些蔬菜碎都是在以key为基础的 map操作下产生的。搅拌将自动完成,你可以假设key是一种原料的名字,就像洋葱一样。 所以全部的洋葱keys都会搅拌在一起,并转移到研磨洋葱的研磨器里。这样,你就能得到洋葱辣椒酱了。同样地,所有的番茄也会被转移到标记着番茄的研磨器里,并制造出番茄辣椒酱。

披萨终于做好了,她点点头说她已经弄懂什么是MapReduce了。我只希望下次她听到MapReduce时,能更好的理解我到底在做些什么。

编注:下面这段话是网上其他人用最简短的语言解释MapReduce:

We want to count all the books in the library. You count up shelf #1, I count up shelf #2. That's map. The more people we get, the faster it goes.

我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。

Now we get together and add our individual counts. That's reduce.

现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。

qinjianxiang
  • 5.9k

你的问题问得太大了,应该自己再做更进一步的学习,重点问你反复学习怎么也不懂的部分。

基本赞同楼上felix021的答案,有几点补充:

  • MapReduce是一种数据处理思想,最早由Google的Jeff Dean等人发明,论文公开后,由Yahoo!的Doug Cutting实现了开源版本的MapReduce实现,发展为后来的Hadoop
  • Hadoop包含一个开源的MapReduce计算框架,和一个分布式文件系统:HDFS
  • MapReduce的精髓是并行处理、移动程序比移动数据更划算
  • 你如果只是做一些简单的统计(如SQL中的count, group by, order by, avg, max, min等),Hive会更适合你,当你把500G都导入hive后,就可以直接在hive的命令行输入SQL(严格的讲,它不是SQL,但真的跟SQL很像很像)来执行你要的查询了
  • Hive和Pig都是基于Hadoop的数据分析工具,它们都依赖Hadoop,但Hadoop不一定用来做数据分析和统计,比如Google拿它来做Index Building
  • 单从性能的角度来讲,你只有一台机器的话,用MapReduce是没有多大意义的,再并发你也只有一台机器啊。但我还是推荐你用Hadoop + Hive,至少你不用操心怎么切割读入这500G数据,不用关心处理到250G的时候失败了怎么办
参考教程

单机安装Hadoop Hive 的十五分钟教程:(我写的)http://rdc.taobao.com/team/top/2011/0...

用PHP来写MapReduce程序(For Hadoop):(还是我写的)http://rdc.taobao.com/team/top/2011/0...

经典的Word Count示例程序:(Hadoop官网的)http://wiki.apache.org/hadoop/WordCou...

比如说要查日志中不同单词出现的次数,把日志平均(注意这个评价不止是说大小,还有概率)分成两份(map),然后由两台机器分别去统计,A机器查到的结果是 {"hello": 3, "world": 5}, B机器查到的结果是 {"world": 4, "program": 2} 。两个一合并(reduce),就得到最终结果 {"hello": 3, “world": 9, "program": 2}

这样一个简单的例子你可以看到,一个map-reduce的过程,就是将一个任务平均划分(通常用上hash以保证平均)成多个互不依赖的子任务分别处理(map),然后再将子任务的结果合并(reduce)的过程。

并不是所有的任务都可以用map-reduce模型来完成的,但是Google通过对模型的简化,使得这样一套系统实际上也能完成相当多的实际任务。

廖鹏宇
  • 63

那个辣椒酱的例子举得很生动,我就讲点MapReduce实际工作时的流程吧。

(1)首先数据(开始只支持字符串,后来支持二进制)进入MapReduce,这时可能有多个在运行Map的节点,数据会分配到这几个Map节点(根据我实际运行情况看,分配是均匀的),Map程序要求数据的输出结果是一个键值对。
(2)在所有数据都经过Map操作后,MapReduce将键相同的键值对合并,相当于一个键对应一个数据列表。
(3)合并后的数据会像分配给Map一样(均匀地)分配给Reduce。
从流程也可以看出,它比较适用于数据项前后不相关的统计工作。
另外,你用python写MapReduce的话,推荐用dumbo,是完全python实现的,使用的是Hadoop中的Streaming(使用了Unix/Linux中的流)。
据我所知Java以外的语言使用的都是Streaming,除了C是使用套接字

MIKE老毕
  • 21

用一句常用的linux shell来解释下吧:
cat |grep|sort|uniq -c > output
map........reduce......

浪迹天涯666
  • 3
新手上路,请多包涵

先 map 再 reduce

宣传栏