2

来自问题:http://segmentfault.com/q/1010000000148955#a-1020000000149523

印度 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”。


justjavac
47.8k 声望15.9k 粉丝

会写点 js 代码