MapReduce浅解析

  1. 1.配置m个worker来map,r个worker来reduce。
  2. 2.将混合均匀的输入文件分成m个输入文件,每个输入文件对应一个doMap。这里的混合均匀表示每份输入文件中的内容之间没有联系,可以拆分成小份一份一份的处理。
  3. 3.对每个输入文件使用doMap进行遍历。每个doMap对应一次mapF(filename string, content string) []KeyValue。doMap首先将输入文件名和文件内容传给mapF处理。mapF处理完这个文件,返回很多键值对,doMap接着将这些混合均匀的键值对们平均分成r份,1每份有多个键值对,2每份对应给一个doReduce处理, 3每份保存到一个文件,文件名格式为jobName-mapTaskIndex-reduceTaskIndex。———注意:mapF返回的<key, value>中的key不是作为参数传给mapF的filename,而是可以随便的。mapF这里就相当于从命令行中读取到了输入。
  4. 4.遍历m次doReduce。doReduce读取m个来自m个doMapTask的文件,(因为每个doMapTask都产生一个文件给每个doReduceTask)。doReduce合并这些文件中key相同的,key有多少个不同的就调用多少次reduceF(key string,  values []string) string。每个reduceF返回这一个key的对应的最终结果值。doReduceTask最终得到所有不同key及其对应的最终结果值。———注意:doReduceTask得到的这些<Key, Value>中的key是mapF返回的key
  5. 5.所有doReduceTask的结果再次合并。

有以下规律:

  1. 一个输入文件对应一个doMap,doMap对应r个输出文件给r个doReduceTask,doReduceTask有m个输入文件来自m个doMap。
  2. 2. 输入文件被均分成m个,每个doMap的结果被均分给r个doReduceTask,每个doReduceTask使用来自每一个doMapTask的输出。