MapReduce是一种在cluster上为了处理大数据集,使用并行,分布式算法的编程模型(什么是cluster请看上篇文章)。它解决了集群架构的三个问题,他的解决方法是:
在多个节点上冗余的存储数据以保证数据和计算的可行性将计算移到接近数据,减小网络传输量提供简单的计算模型来隐藏分布式环境 2 分布式文件存储(Distributed File System)
DFS是一种冗余存储的基础设施,提供了全局文件命名空间,并且能在一个cluster的节点间使用。一些著名的分布式文件存储有:Google GFS, Hadoop HDFS.
DFS有三个主要的成分:chunk servers,Master Nodes, Client API。
Chunk Servers:大型数据文件被划分为多个连续的的指定大小的"chunks"(一般在16M-64M左右)。每个chunk会在多个节点上复制存储,这些节点也被称为chunk servers。一般每个chunk会有2-3个副本,每个副本都在不同的chunk server上,最少每个rack上有一个副本。这些chunk servers也作为computational servers,对数据执行计算。Master Nodes:存储分布式文件系统中文件的元数据。比如:每个文件被分为多少chunks,每个chunks在哪里。Client API:允许用户访问存储在chunk servers的数据。用户通过API访问Master Node某个指定的chunk在哪,Master Node回复所需信息。在此之后,任何用户与chunk server的交流都不要再通过Master Node,可以直接交流。 3 MapReduce
如上所述,MapReduce是被设计的一种拥有简易并行编程,软硬件隐形管理,简易大数据管理的编程模式。拥有多种实现:Spark,Hadoop,Flink,等等。
接下来是一个运用MapReduce思想的一个例子:
假设你有一个很大的文本文件doc.txt,而你的任务是统计其词频。假如这个文件可以一次性放入内存,那么很简单,只需要初始化一个空hash table,逐行逐词统计即可。
但是如果大到无法一次性放入内存呢?
我们建立以下模型:
Input: (key,value) pairs集合
Output:另一个(key,value) pairs集合
定义两个方法:map,reduce。再由framework提供一个shuffle方法。
输入的key-value pairs:
map:,输入key-value pair,输出0个或多个中间key-value pair。每个键值对(key-value pairs)都执行同一个map函数,并行执行。reduce:即:所有有相同键的被归约到一起。每个相同的key执行相同的reduce函数。
在例子中:
Map step:将文件doc.txt的一个chunk作为输入,通过map函数可以得到每个chunk中每个单词的词频的集合。
Shuffle step:由map step后得到的输出结果被排序并打乱
Reduce step:将shuffle后的结果作为输入,计算一个聚合函数,得到结果。
MapReduce 伪代码:
map(key,value):
# key: docID; value: text 这里的输入(key,value)对是单个对,因为真正的划分是由framework完成的
foreach word in value:
emit(word,1)
reduce(key,values):
#key: word; values: text
result =0
foreach v in values:
result +=v
emit(key, result)
4 MapReduce的优缺点
MapReduce适合:需要许多顺序数据访问的问题,大批量的工作
MapReduce不适合:需要随机访问数据的问题,图问题,相互依赖的数据



