关于MapReduce的理解

https://www.zhihu.com/question/23345991


关于MapReduce的理解?

我可不可以简单的将MapReduce理解为: Map负责分发任务 Reduce负责回收完成的任务…
16 个回答

大数据时代的数据分析任务比传统的数据分析任务要复杂,因为往往涉及的数据量巨大,比如要分析汇总某个大型零售商在全国的销售数据,查看某个搜索引擎的特定词条的访问日志… … 通常来讲,我们的笔记本电脑可以同时干很多事儿,比如听音乐,编辑Word文档,下载电影,这些都可以同时进行,为什么呢?因为这些程序任务所处理的数据量规模小。而对于大规模的数据处理任务来说,就不是一台电脑同时做许多任务了,而是许多电脑同时做一件任务的逻辑关系。假如你写了一个程序,然后让你的电脑来跑一个比较大的数据量(例如把百度百科上所有的词条分析一遍…),那么你的电脑需要很长很长的时间来做这件事…大多数情况下,数据还没跑完,你的电脑就被累死了(死机…)。那么怎么办?就有人考虑到了用许多台电脑来同时完成这个任务。这就引入了并行计算的概念。



许多电脑同时做一件复杂的任务,涉及很多问题:比如,这个任务首先要分解成许多子任务,然后这些小任务要在这些电脑上面去分配,然后这些电脑完成了任务之后反馈的结果还要汇总,同时还要考虑如果这些电脑的故障异常等问题怎么去解决…MapReduce就是这样的一个编程模型,一个复杂的任务按照这个抽象的模型去实现,就可以有效进行并行计算。



这个编程模型究竟是怎样的呢?他实际上说了这样一个事儿:已知手头上有许许多多(几万也许,甚至几十万…)PC机,每一个可能很挫,但是如果这些PC机团结协作起来,可以PK一个大型的工作站。现在有个复杂的任务,需要处理海量的数据。数据在哪里?数据实际上是随机地存储于这些个PC机器上的。我们不需要统一地把数据一起存到一个超大的硬盘上,数据可以直接散布在这些个PC上,这些PC自身不仅是许许多多个处理器,也是许许多多个小硬盘。



这些PC机器分为三类,第一类称为Master,Master是负责调度的,相当于工地的工头。第二类叫Worker,相当于干活儿的工人。Woker进一步分为两种,一种Worker叫Mapper,另一种叫Reducer。假设我们有一个巨大的数据集,里面有海量规模的元素,元素的个数为M,每个元素都需要进行同一个函数处理。于是Master将M分成许多小份,然后每一份分给一个Mapper来做,Mapper干完活儿(执行完函数),将自己那一份儿活儿的结果传给Reducer。Reducer之后统计汇总各个Mapper传过来的结果,得到最后的任务的答案。当然,这是最简单的表述,因为实际上Master的任务分配过程是很复杂的,会考虑任务时间?任务是否出错?网络通讯负担等等等等许多问题,这里不作赘述。


假设原始任务的Input个数为M,output个数为N。Mapper的个数为P,Reducer的个数为R。则有关系,M〉P〉N〉R。也就是说,一个Mapper要做M/P个input的处理任务,一个Reducer要做N/R个output的汇总工作。每个output有一个编号,假设为o1,o2,o3…oN。当一个Mapper处理完自己那一份儿input之后,每个input i被处理后转化为一个中间结果m。这个m很自然地会若干output(如:m1对应o1,o3,o5) 会有贡献。每个Reducer负责一个或多个o的汇总处理。假如某个Reducer负责o1,o2,o3,那么凡是对应到o1,o2,o3的被处理过的m都会传给这个Reducer做汇总处理。



举例来说,统计一系列文档中的词频。文档数量规模很大,有1000万个文档,英文单词的总数可能只有3000(常用的)。那么input M=10000000,output N=3000。于是,我们搞了10000个PC做Mapper,100个PC做Reducer。每个Mapper做1000个文档的词频统计,统计之后把凡是和同一个word相关的统计中间结果传给同一个Reducer做汇总。比如某个Reducer负责词表中前30个词的词频统计,遍历10000个PC,这10000个Mapper PC把各自处理后和词表中前30个词汇相关的中间结果都传给这个Reducer做最终的处理分析。至此MapReduce最核心的流程已经说明白了。



其实MapReduce讲的就是分而治之的程序处理理念,把一个复杂的任务划分为若干个简单的任务分别来做。另外,就是程序的调度问题,哪些任务给哪些Mapper来处理是一个着重考虑的问题。MapReduce的根本原则是信息处理的本地化,哪台PC持有相应要处理的数据,哪台PC就负责处理该部分的数据,这样做的意义在于可以减少网络通讯负担。最后补上一副经典的图来做最后的补充,毕竟,图表往往比文字更有说服力。

谢邀!map和reduce函数是要执行的任务,由master分配任务给worker执行。map函数读取被分配的输入数据片段,输出中间key/value pair值的集合,reduce函数收集具有相同中间key值的value值,合并这些value值,形成一个较小的value值的集合。

可以以wordcount为例,具体可以看 Google MapReduce中文版

回答的很好了。
map-reduce背后的思想很简单,就是把一些数据通过map来归类,通过reducer来把同一类的数据进行处理。

map-reduce之所以有效是基于两个哲学(好吧,这是我自己定义的), (1)大而化小 和 (2) 异而化同。 这两个应对了大数据中的volume和variety挑战。

假设我们手上有很多复杂数据,那么怎样来处理呢? 第一步就是分类,把数据分类。 分类后的数据就不复杂了,这就是异而化同。 分类之后数据还是很多,怎么办呢? 第二步,分割。 分割就是把数据切分成小块, 这样就可以并发或者批量处理了, 这就是大而化小。

回到 map-reduce概念上, map的工作就是切分数据,然后给他们分类,分类的方式就是输出key,value对,key就是对应“类别”了。 分类之后,reducer拿到的都是同类数据,这样处理就很容易了。

以上就是我理解的MapReduce的思想。 更细节的实现可以参考

的答案。 可见MapReduce思想很简单,但是要灵活运用却不是很容易。 MapReduce只是一个概念,如何玩转它就是一门艺术了。

欢迎讨论。
这里是一个很有趣的图片解释MapReduce原理
首先从一堆三明治的完整成分开始,然后map到各种完整成分下的切碎的蔬菜啊肉片啊,接着转移,排序,凝聚到不同的完成三明治里,各有各的不同口味~


理解 MapReduce 的思想没什么难的,更多的在于细节,特别是 Shuffle.

之前在网上看到的感觉非常棒的解释。

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

其实我们可以从word count这个实例来理解MapReduce。MapReduce大体上分为六个步骤:input, split, map, shuffle, reduce, output。细节描述如下:

  1. 输入(input):如给定一个文档,包含如下四行:
  • Hello Java
  • Hello C
  • Hello Java
  • Hello C++

2. 拆分(split):将上述文档中每一行的内容转换为key-value对,即:

  • 0 - Hello Java
  • 1 - Hello C
  • 2 – Hello Java
  • 3 - Hello C++

3. 映射(map):将拆分之后的内容转换成新的key-value对,即:

  • (Hello , 1)
  • (Java , 1)
  • (Hello , 1)
  • (C , 1)
  • (Hello , 1)
  • (Java , 1)
  • (Hello , 1)
  • (C++ , 1)

4. 派发(shuffle):将key相同的扔到一起去,即:

  • (Hello , 1)
  • (Hello , 1)
  • (Hello , 1)
  • (Hello , 1)
  • (Java , 1)
  • (Java , 1)
  • (C , 1)
  • (C++ , 1)

注意:这一步需要移动数据,原来的数据可能在不同的datanode上,这一步过后,相同key的数据会被移动到同一台机器上。最终,它会返回一个list包含各种k-value对,即:

  • { Hello: 1,1,1,1}
  • {Java: 1,1}
  • {C: 1}
  • {C++: 1}

5. 缩减(reduce):把同一个key的结果加在一起。如:

  • (Hello , 4)
  • (Java , 2)
  • (C , 1)
  • (C++,1)

6. 输出(output): 输出缩减之后的所有结果。

这学期在上方面的内容,我对MapReduce理解有限,但是毫无疑问,看论文是最好的方式。

原作是allendowney.com/ss08/ha。前面提到的mapreduce中文版我看了下,也是极好的。

其实你也可以看看其他相关的论文,在background部分也有mapreduce的介绍和理解。比如pages.cs.wisc.edu/~akel FlumeJava这篇,这里的2. Background on MapReduce我随手翻译下

Map阶段:首先是读数据,数据来源可能是文本文件,表格,MySQL数据库。这些数据通常是成千上万的文件(叫做shards),这些shards被当做一个逻辑输入源。然后Map阶段调用用户实现的函数,叫做Mapper,独立且并行的处理每个shard。对于每个shard,Mapper返回多个键值对,这是Map阶段的输出。

Shuffle阶段:把键值对进行归类,也就是把所有相同的键的键值对归为一类。这个步骤的输出是不同的键和该键的对应的值的数据流。

Reduce阶段: 输入当然是shuffle的输出。然后Reduce阶段调用用户实现的函数,叫做Reducer,对每个不同的键和该键的对应的值的数据流进行独立、并行的处理。每个reducer遍历键对应的值,然后对值进行“置换”。这些置换通常指的的是值的聚合或者什么也不处理,然后把键值对写入数据库、表格或者文件中。

翻译的好搓,凑合的看吧。逃(
举个栗子,要斗地主了,需要从10副混一起的牌里找出一幅牌,10副牌分10堆给10个人去清,每个人分别把黑红梅方放一堆,这就是map
然后安排4个人每人去清一种花色的牌,从中找出1到K,这就是reduce了

不可以,过于简单的分类会限制你的想象力。

例如,就算是对于相同的任务,在数量级不同时,mapper和ruducer都可以有完全不同的设计。
而对于单一一次mapreduce任务,没有mapper或者reducer都是很正常的。

学习mr的时候,最重要的是理解每一步的特性,了解每一步擅长做什么,最后再针对特定任务将wordload分解成数个mr任务来消化掉。
川大唐常杰教授关于map reduce的航班模型挺好理解的。m.blog.csdn.net/article

MapReduce的灵感来源于函数式语言(如Lisp)中的内置函数Map和Reduce。简单来说,在函数式语言里,Map表示对一张列表(List)中的每个元素进行计算,Reduce表示对一张列表中的每个元素进行迭代计算。

可以这样理解,把一堆杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果,Map面对的是杂乱无章的、互不相关的数据,它解析每个数据,从中提取出Key和Value,也就是提取数据的特征。

MapReduce 是一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式并行编程模式,主要用于大规模并行程序并行问题。

大数据时代,数据影响、数据应用、数据的计算模式,具体都是怎么定义的,处在DT时代的们,怎么能不知道,大数据现在处于什么阶段,入行大数据,需要学习哪些基础知识? - 大数据 多智时代

摘录自IBM的一段话:The term MapReduce actually refers to two separate and distinct tasks that Hadoop programs perform. The first is the map job, which takes a set of data and converts it into another set of data, where individual elements are broken down into tuples (key/value pairs). The reduce job takes the output from a map as input and combines those data tuples into a smaller set of tuples. As the sequence of the name MapReduce implies, the reduce job is always performed after the map job.

还有一个简单有趣而生动的故事(我没找到比这更好的故事)。

谢邀,举个例子,大型饭店,有三个水平各异的厨师,假如每个厨师从洗菜、配菜、炒菜都自己做,那整个饭店离黄就不远了。假如三个厨师分工洗菜、配菜、炒菜各一个,每个人效率都获得极大提升,饭店还可以高效经营。


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

搬运自 —— 我是如何向老婆解释MapReduce的? - 文章 - 伯乐在线

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值