mit的分布式实验。第一个实验就是实现google MapReduce论文的简单版本,基于课程要求,我的代码就不公开了(本身也不会go,边写边查资料的,临时磨枪上阵,代码写得太烂)。
直接我的思路。
流程
分为两个部分,master和worker。
master:
启动3个goroutine。
1.RPC服务器。提供两个rpc接口GetTask和markTaskFinish,用于获取任务和标记任务完成。
2.任务状态检查,检查所有任务是否完成,如果完成就进入下一个阶段,一共三个阶段,map->reduce->finish。还要检查任务是否超时,如果超时则重新标记为空闲。
3.master状态检查,检查任务状态是否为finish如果为finish则结束进程(这个就是mrmaster做的事情,所以实际上这条就可以忽略了,只要你重写一下检查函数)。
worker:
大致可以写成这样的伪代码。
while(true):
task = GetTask()
DoTask(task)
MarkTaskFinish()
大致就是三个过程,先获取任务->做任务->标记任务完成。当然还有一些细节,实际上你要通过GetTask获得的状态得知是否整个MapReduce已经完成了,如果已经完成,此时你要跳出循环。
还有当获取不到任务的时候要sleep一下,避免发太多RPC调用。
MapReduce的过程
假设你要hash成x个reduce work。
Map
1.master对每个文件输入文件初始化成一个map任务。
2.worker对文件的每个字符串调用map函数,得到新的字符串,新的字符串根据key来hash输出到对应的文件中。(当然其实这个过程是先写到中间文件再rename到结果文件)
3.worker记录所有的输出文件,通过MarkTaskFinish标记任务完成同时告诉master写到了哪些文件。
Reduce
1.master会整理哪些文件是对应哪个reduce work的,然后初始化reduce Task。
2.worker会对reduce Task中每个文件的内容读进来排序,对同一个key的数组的内容调用reduce函数得到结果,将结果写到对应的输出文件中。
3.同样执行完告诉master任务完成并且输出到了哪些文件。
如果有哪个地方不清楚,可以联系我,我在能力范围内解答,代码为了尊重教授的想法是不可能公布的。顺便贴下结果。