lab1的任务是实现一个分布式的MapReduce程序,其中,Map函数和Reduce函数都已经写好,输入输出的文件名已经给出,并且课程也给出了在单个程序里模拟MapReduce任务的示例代码。
分布式程序的框架由有两组程序组成:
- 第一组的代码是
coordinator.go
,只有一个进程,这个进程负责把任务分发给工作节点; - 第二组的代码是
worker.go
,有多个进程,从调度节点接收任务,完成后输出到文件; - 第三组的代码是
rpc.go
,主要用于实现rpc调用的参数和返回值的数据结构。
设计这个小的分布式程序的关键可能在于两点:
- 捋清楚每一步的输入和输出是什么,在模拟程序中,输入和输出是当前程序里的数据结构,而在分布式环境中,输入输出可能是文件名;
- 捋清楚每个节点自己的工作模式,对于调度节点,它需要知道当前整体任务的进度,把没做完的任务放到任务队列里,整理做完的任务返回的结果,对于工作节点,它需要不断地请求任务,上传结果;
- 捋清楚每个节点之间的通信协议,调度节点和工作节点之间主要有“申请任务”和“上传结果”两个交互过程,可以设计两个RPC调用。