MapReduce是分布式计算系统,可以快速的处理大文件。
程序员基于MapReduce的java开发包编写客户端程序,配置并请求运行在服务器集群的MapReduce系统执行一个作业(job)。客户端程序除了指定要处理的大文件、输出结果的文件,还要指定两个函数,分别是map函数和reduce函数,系统就是根据这两个函数来对文件进行处理。
系统先对大文件分片,然后并发的处理每个分片数据,处理过程就是调用map函数。map函数一次接受一个input key/value pair,输出一个或多个‘中间’(intermediate)键值对,当系统处理完所有分片数据就得到了很多的中间键值对。
系统将所有中间键值对集合起来,具有相同键的键值对作为一个分片,如果某个键的键值对的个数非常大,系统还会对其再分片。然后系统并发的处理这些分片,处理过程就是针对每个分片调用reduce函数。reduce函数一次接受一个中间键以及对应的一组中间值,该函数会merge这些值,减少值的数量,然后输出一个或多个经过reduce后(数量被reduce)的中间键值对,输出的中间键值对会在下次系统调用reduce函数时做为输入,也就是说,这是一个迭代的过程,输出作为输入,直到系统找不到具有相同键的键值对,此时,系统无法也无需根据键来集中具有相同键的键值对了,系统最后将所剩的键值对写入到指定的输出文件中,完成了对客户端请求的作业(job)的计算。
可以将reduce函数最后输出的每个键看做客户端请求系统计算的一个问题,而键对应的值就是该问题的最终答案。
以上理解可以对照word count例子的代码来看。
本文参考了论文《MapReduce- Simplified Data Processing on Large Clusters》。
如有理解不对,欢迎指正,O(∩_∩)O谢谢