按着Google论文的说法, MapReduce是一种编程模型。 专为处理超大数据集的一种实现。 分为Map和Reduce两个阶段。 用户首先创建Map函数处理输入的
什么是MapReduce
按着Google论文的说法, MapReduce是一种编程模型。 专为处理超大数据集的一种实现。 分为Map和Reduce两个阶段。 用户首先创建Map函数处理输入的
然后输出 ; 然后在创建Reduce函数对输入的 进行合并 生成结果。
它有什么好处
可以在大量的普通的计算机上并行执行, 将大数据分割成多个小数据块在各个普通计算机上进行并行运算快速得到运算结果。
可以用在哪些方面
- 计算URL访问频率:
> Map函数处理日志中的Web请求记录然后输出
, reduce函数将相同url的value值累加起来产生 的结果 - 倒排索引: > Map 函数分析每个文档输出一个(词,文档号)的列表,Reduce 函数的输入是一个给定词的所有 (词,文档号),排序所有的文档号,输出(词,list(文档号))。所有的输出集合形成一个简单的倒排索引,它 以一种简单的算法跟踪词在文档中的位置。
- 分布式排序: > Map 函数从每个记录提取 key,输出(key,record)。Reduce 函数不改变任何的值。
执行流程概括
会有几个术语说明
- worker 表示运算程序
- master 应用程序调度者 负责分配任务
###流程
- 用户程序需要调用MapReduce库将输入文件分割成M个数据片段。 然后在机器集群中创建大量程序副本。其中有个特殊副本为master, 其他副本用于执行任务。
- 然后master将M个Map任务和R个Reduce分配到一个空闲的worker上。
- 被分配的Map任务(如编号m)开始读取m号的数据片段,解析对应的
然后调用用户自定义的map函数生成 并缓存到内存中。 - 缓存的
根据hash(key) mod R 运算分到R个区域写入本地磁盘上。master负责将这些存储位置传送给Reduce worker - Reduce worker读取Map worker存储的数据首先对key进行排序将相同的key值进行聚合。
- Reduce worker遍历排序后的中间数据将
传递给用户自定义的Reduce函数,将结果追加到输出。 - 所有Map和Reduce任务完成后, 则master唤醒用户任务执行完成。
一个大文件排序的例子
假设有一个超大文件每一行均是一个数字, 使用MapReduce对这个大文件如何排序呢? 按着上述流程我们一步步分析一下。
首先将大文件分成M块 每一块的内容类似下面这样 > 100 897876 101 7837 102 4827482 ….
将每块内容在Map阶段进行计算会生成中间文件生成R份中间文件, 每份中间文件的内容类似下面这样 假设下面是第r块的内容 > 2728374 line-x 83748247 line-q 1 line-a 2728374 line-d …
Reduce从对应的块上读取内容,将其进行排序然后生成中间文件 假设下面是第r个Reduce任务执行生成的结果 > 1 (line-a) 2728374 (line-x, line-d) 83748247 (line-q)
所有会生成R个类似上面的数据, 每一块数据是排好序的。
接下来可以使用归并排序将所有的输出合并成一个排序的文件。
结论
自己没有做过大数据相关的工作, 只是想了解一下MapReduce的大概是什么。 可能没有更深入的分析。 但是整个流程应该就是这样。 关于一些细节如如何进行任务粒度拆分, 如何进行容错处理, 如何catch用户程序崩溃问题, 如何对分布式系统进行问题追踪和调试待以后做相关工作在具体分析吧。