为什么需要MapReduce
MapReduce是一个分布式运算程序的编程框架。核心功能是用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序。
什么是分布式程序
如果一批文本文件有2G大小。假设我们要统计每个单词出现的总次数。我们无法单独的用一台机器处理。我们要写一个程序同时在多个机器上运行。
首先第一个问题是如何存放文件?将文件存放到HDFS上去。
每个机器只能统计到自己机器上的数据,但是无法得出全局的结论。
所以,分布式的运算程序往往需要至少分成2个阶段
第1个阶段是在指定范围内进行计算,然后发给第2个阶段。同一段代码在多个实例上运行。
第2个阶段读入第1阶段的输入,然后进行汇总处理。可能运行多个实例,但是对每一种的输入(第1阶段的输出,需要以某种方式标注属于哪一种,常常是Key)必须统一发给一个实例。
对应到MapReduce中
阶段1(Map).第1阶段的task并发实例各司其职,互不相干。完全并行。
阶段2(Reduce).第2阶段的task并发实例互不相干,但是它们的数据依赖于上一个阶段的所有task并发实例的输出。这种依赖关系可能是一种全局的。
MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段。如果业务很复杂,通过2个阶段搞不定,就再搞一个MapReduce程序。将上一个MapReduce程序的输出作为输入。
如何完成任务
Map Task
- 使用HDFS的流式API一行行的读入文件数据。
- 按空格切分行内切分单词
- 用HashMap统计每个单词的出现频率
- 将HashMap按首字母分成3个HashMap
- 将HashMap分别传给下一个阶段
这个过程中有若干个复杂的细节问题:
- MapTask如何进行任务分配
- ReduceTask如何进行任务分配
- MapTask如何知道每个ReduceTask运行在哪个机器上,它们如何衔接
- 如果某些MapTask运行失败,如何处理
- MapTask如果都要自己负责输出数据的分区会非常麻烦
这些问题应该如何解决?对上述的思想进行修改。
上面的问题主要是在于如何协调MapTask和ReduceTask。它们需要一个主管,叫做MR Application Master。由MAP Master启动MapTask和ReduceTask,在启动时分配任务。MapTask只需要把输出给自己的工作目录,接下来MAP Master会启动ReduceTask,告诉它们如何去取数据。如果有一个任务失败了,MAP Master可以在另一台机器上启动一个Map Task。
总结
一个分布式计算程序需要有3部分组成,MapTask,ReduceTask,MAP Master。MAP Master不负责业务的处理,只负责任务的协调。