6.824 MapReduce
MapReduce是论文中提出的一种大数据计算框架,谷歌根据他们的计算业务,将大数据计算抽象成一系列Map操作和Reduce操作,基于MapReduce任务调度集群,数据分析人员只需要编写基本的Map函数和Reduce函数即可在大规模集群上运行分布式计算,无需考虑具体的分布式调度过程。
本实验是编写一个MapReduce分布式任务调度服务,整体为Master/Worker架构。首先Master启动,根据输入文件列表拆分为X个Map任务和Y个Reduce任务。Worker启动后定时通过rpc向Master发生心跳消息,Master初次收到新Worker消息会创建并返回WorkerID,并将Worker加入到空闲Worker队列中。Worker节点是支持动态扩容的。
任务执行阶段,对于Map任务,Master不断从空闲Worker队列中取出Worker节点,并当下一次心跳时将Map的输入文件位置、Reduce任务数量等信息发生给Worker,Worker收到任务并开始执行。Map函数的输入是文件的每一行,输出是kv列表,Worker对输出结果进行shuffle,利用hash函数运算k并对Reduece任务的数量取模,结果追加到X_Y.tmp中间文件中。当前Worker的Map任务执行完成后,会通过心跳将输出文件列表发送给master。Master将此Worker再放入空闲队列等待下次调度。当所有Map任务执行完成,Master将所有中间文件夹根据Reduce任务号进行分组,再把Reduce任务分配给Worker,Worker收到文件列表会先全部读取,排序,将相同key和value的列表传入Reduce函数,reduce结果追加到以Reduce任务号结尾结果文件中。并将结果返回Master,Master确认所有Reduce任务结束,整个任务执行完毕。
高容错的设计
-
Master维护了每个Worker的上次心跳时间,当超时一定时间将Worker移除,并将其任务重新分配。当Worker恢复会再次将其加入Worker队列中。
-
Map和Reduce输出结果都是先追加到临时文件中,当整个Map或Reduce任务执行完毕再将其重命名到最终文件,这样即使因为网络问题导致的任务重复执行,也不会有问题。