问题:
Map-Reduce的目标是在面对节点失效的情况时能够保证大量的文件和数据依然可用。
初始化时数据被分割成许多分块的小数据,这些数据都是以<key,value>的形式存储。用户程序会分配一个Maser 进程和许多worker 进程。
任务开始时,Maser 将用户程序的工作分成两种类型的任务(map 任务和reduce 任务),并将这些任务分配给相应的工人(workers)。Maser 的责任如下:给map 工人和reduce 工人分配相应的任务,检测是否有工人进程死掉,将Map 任务处理后的结果通知给Reduce 任务。
得到Maser 的Map 工作任务的指令后,Map 工人开始工作。Map 工人从input中获取分块的数据,并通过其中数据存储的方式对数据进行处理,并将处理的中间结果(<key,value>形成的链表)存放在本地磁盘中。
得到Maser 的有关Map 处理结果的通知后,Reduce 任务开始工作。Reduce 工人把每个map 工人的本地磁盘中的内容进行整合,形成有序的最终结果,并将结果写入到输出文件中。
假如一个工人进程失败了,该工人的任务就被分配给其他的工人进程。如果一个Maser 进程失败了,那么整个Map-Reduce任务就会终止。
1.输入文件分成M 块,每块大概16M~64MB(可以通过参数决定),接着在集群的机器上执行分派处理程序。
2.M 个Map 任务和R 个Reduce 任务需要分派,Maser 选择空闲Worker 来分配这些Map 或Reduce 任务。
3.Worker 读取并处理相关输入块,Map 函数产生的中间结果<key,value>对暂时缓冲到内存。
4.中间结果定时写到本地硬盘,分区函数将其分成R 个区。中间结果在本地硬盘的位置信息将被发送回Maser,然后Maser 负责把这些位置信息传送给ReduceWorker。
5.当Maser 通知执行Reduce 的Worker 关于中间<key,value>对的位置时,它调用远程过程,从Map Worker 的本地硬盘上读取缓冲的中间数据。当Reduce Worker读到所有的中间数据,它就使用中间key 进行排序,这样可使相同key 的值都在一起。
6.Reduce Worker 根据每一个唯一中间key 来遍历所有的排序后的中间数据,并且把key 和相关的中间结果值集合传递给用户定义的Reduce 函数。Reduce 函数的结果写到一个最终的输出文件。
7.当所有的Map 任务和Reduce 任务都完成的时候,Maser 激活用户程序。此时MapReduce 返回用户程序的调用点。
● 参考解析