MapReduce原理与设计思想

一个有趣的例子

你想数出一摞牌中有多少张黑桃。直观方式是一张一张检查并且数出有多少张是黑桃?

MapReduce方法则是:

给在座的所有玩家中分配这摞牌

让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你

你把所有玩家告诉你的数字加起来,得到最后的结论

拆分

MapReduce合并了两种经典函数:

映射(Mapping)对集合里的每个目标应用同一个操作。即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping。

化简(Reducing )遍历集合中的元素来返回一个综合的结果。即,输出表单里一列数字的和这个任务属于reducing。

重新审视上面的例子

重新审视我们原来那个分散纸牌的例子,我们有MapReduce数据分析的基本方法。友情提示:这不是个严谨的例子。在这个例子里,人代表计算机,因为他们同时工作,所以他们是个集群。在大多数实际应用中,我们假设数据已经在每台计算机上了 – 也就是说把牌分发出去并不是MapReduce的一步。(事实上,在计算机集群中如何存储文件是Hadoop的真正核心。)

通过把牌分给多个玩家并且让他们各自数数,你就在并行执行运算,因为每个玩家都在同时计数。这同时把这项工作变成了分布式的,因为多个不同的人在解决同一个问题的过程中并不需要知道他们的邻居在干什么。

通过告诉每个人去数数,你对一项检查每张牌的任务进行了映射。 你不会让他们把黑桃牌递给你,而是让他们把你想要的东西化简为一个数字。

另外一个有意思的情况是牌分配得有多均匀。MapReduce假设数据是洗过的(shuffled)- 如果所有黑桃都分到了一个人手上,那他数牌的过程可能比其他人要慢很多。

如果有足够的人的话,问一些更有趣的问题就相当简单了- 比如“一摞牌的平均值(二十一点算法)是什么”。你可以通过合并“所有牌的值的和是什么”及“我们有多少张牌”这两个问题来得到答案。用这个和除以牌的张数就得到了平均值。

MapReduce算法的机制要远比这复杂得多,但是主体思想是一致的 – 通过分散计算来分析大量数据。无论是Facebook、NASA,还是小创业公司,MapReduce都是目前分析互联网级别数据的主流方法。

本文地址:,转载请注明源地址。

Hadoop中的MapReduce

大规模数据处理时,MapReduce在三个层面上的基本构思

如何对付大数据处理:分而治之

对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治之的策略

上升到抽象模型:Mapper与Reducer

MPI等并行计算方法缺少高层并行编程模型,为了克服这一缺陷,MapReduce借鉴了Lisp函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型

上升到构架:统一构架,为程序员隐藏系统层细节

MPI等并行计算方法缺少统一的计算框架支持,程序员需要考虑数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节

1.对付大数据处理-分而治之

什么样的计算任务可进行并行化计算?

并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对划分的子任务或数据块同时进行计算。但一些计算问题恰恰无法进行这样的划分!

Nine women cannot have a baby in one month!

例如:Fibonacci函数: Fk+2= Fk+ Fk+1

前后数据项之间存在很强的依赖关系!只能串行计算!

结论:不可分拆的计算任务或相互间有依赖关系的数据无法进行并行计算!

大数据的并行化计算

一个大数据若可以分为具有同样计算过程的数据块,并且这些数据块之间不存在数据依赖关系,则提高处理速度的最好办法就是并行计算

例如:假设有一个巨大的2维数据需要处理(比如求每个元素的开立方),其中对每个元素的处理是相同的,并且数据元素间不存在数据依赖关系,可以考虑不同的划分方法将其划分为子数组,由一组处理器并行处理

2.构建抽象模型-Map和Reduce

借鉴函数式设计语言Lisp的设计思想

—函数式程序设计(functional programming)语言Lisp是一种列表处理 语言(List processing),是一种应用于人工智能处理的符号式语言,由MIT的人工智能专家、图灵奖获得者John McCarthy于1958年设计发明。

—Lisp定义了可对列表元素进行整体处理的各种操作,如:

如:(add #(1 2 3 4) #(4 3 2 1)) 将产生结果: #(5 5 5 5)

—Lisp中也提供了类似于Map和Reduce的操作

如: (map ‘vector #+ #(1 2 3 4 5) #(10 11 12 13 14))

通过定义加法map运算将2个向量相加产生结果#(11 13 15 17 19)

(reduce #’+ #(11 13 15 17 19)) 通过加法归并产生累加结果75

Map: 对一组数据元素进行某种重复式的处理

Reduce: 对Map的中间结果进行某种进一步的结果整

关键思想:为大数据处理过程中的两个主要处理操作提供一种抽象机制

MapReduce中的Map和Reduce操作的抽象描述

MapReduce借鉴了函数式程序设计语言Lisp中的思想,定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:

—map:(k1; v1)→[(k2; v2)]

输入:键值对(k1; v1)表示的数据

原来和文字沾上边的孩子从来都是不快乐的,

MapReduce原理与设计思想

相关文章:

你感兴趣的文章:

标签云: