MapReduce 学习思考
前言
MapReduce 是我最近知晓的一个编程模型,简单学习了一下,发现它的设计思路和之前 Rob Pike 演讲的 go 语言并发模式还有一点异曲同工之妙,所以在此整理归纳一下。
一.MapReduce 简介
MapReduce 是 Google 提出的一个软件架构,用于大规模数据集(大于 1TB)的并行运算。简而言之,就是将任务切分成很小的任务然后一个一个区的执行最后汇总。
MapReduce 通常由三个步骤组成
map 操作:每个 worker 节点对本地数据应用 map 函数,并将输出写入临时存储。主节点负责文件的分配。
shuffle:需要将 map 阶段的 worker 节点根据生成的 k/v 数据重新分配,保证相同 key 的数据位于 reduce 阶段的同一个工作节点上。(这一步视实际场景可以省略,如计算一个无重复文件中每个单词的长度,就没有必要 shuffle)
reduce 操作:reduce 阶段主要负责并行的将接收到的 k/v 数据进行处理
需要注意的是如果是单线程的实现 MapReduce 并不会比不用 MapReduce 快,MapReduce 的收益通常在多处理器硬件上的多线程实现中看到。
二.Example
2.1 问题
让我们来解决这样一个问题--当前我有上千个文件,每个文件都有上万个单词,我需要统计所有文件中的单词出现的总次数,请问我们应该怎么办?
2.2 思考
结合一下 MapReduce 的思维,我们来解决一下这个问题。
将数千个文件均分到 map 阶段的节点上,map 阶段的作用是计算分给自己的这些文件中每个单词出现的总次数,这一步并行的进行统计
shuffle 阶段用于保证 map 阶段的数据相同的单词结果一定到相同的 reduce 节点上
reduce 节点进行最后的汇总处理
这便是一个简单的 MapReduce 的模式应用。
三.对比总结
可以看到 MapReduce 的核心思路是将一个大的任务拆分成了很多个小的任务,之后的任务依赖于之前任务的输出。
我在学习 MapReduce 编程模型的过程中脑海里不断浮现的是我之前听过的一个讲座--Concurrency Is Not Parallelism
演讲核心是告诉我们:并发是有关结构的,它是一种将一个程序分解成多个小片段并且每个小片段都可以独立执行的程序设计方法;并发程序的小片段之间一般存在通信联系并且通过通信相互协作,熟练运用并发结构,能够极大的提高我们程序的运行速度。
如我们需要组装海量数据,运用并发思维,任务一用于读取数据--》任务二针对读取到的数据进行一系列组装--》任务三合并任务三的数据到最终结果。
在理想的情况下这样就比单纯的读取数据,组装,写结果快三倍。
MapReduce 拆分的核心理由当然是数据集庞大,需要分片,但是换一种思路它也是将数据处理这个任务进行了拆分,和高并发思维一致,这是我个人觉得很有意思很共通的点。
参考链接
https://en.wikipedia.org/wiki/MapReduce#Examples
评论