前言:
最近到毕业的季节了,想着在工作前锻炼下自己阅读英文文献的能力,又对分布式有兴趣,就开了分布式的坑。国内分布式资料较少,因此参考了mit的课程:http://nil.csail.mit.edu/6.824/2015/schedule.html
这门课虽然没有视频,但是给出了分布式相关的论文,并设置了5个实验(go语言),今天终于完成了lab1.有需要的同学可自取。
Lab1
第一个实验分成了三个部分:
part 1: 实现map reduce模型的“Hello World”:计算海量文本的单词出现频率
part 2: part 1中分配map 和reduce任务不是并行的,因此在这个部分,你需要将map和reduce改写成并行的
part 3:part 2中假设worker是不会出错的,现在你需要解决worker出错的情况
前两个部分实际上是part3的子集,所以下面只有part 3的解释
代码:
链接: https://pan.baidu.com/s/1z38zbg1hORT3383miQYhxA
提取码: 3rh2
part 3解释:
我们需要做什么?
1. 因为新worker随时可能注册,我们需要一个协程来不断处理新注册的worker地址
2. 因为旧worker随时可能被kill,我们需要不断更新worker的状态
3. 因为被分配的任务可能由于worker被kill导致无法完成,所以我们需要查看任务是否已经被分配完
工作流程:
大概流程如上,但是随时有新worker注册/旧worker失效,所以这些模块是运行在不同协程的(多线程)。
实现:
lab1自带了一个MapReduce结构体,是用来管理数据的。
在额外状态那里,我用数组(slice?)维护需要分配的任务的状态,和一个int类型保存已经完成任务的数量。
type JobState struct{
JobNum int
// 0 not done
// 1 assigned
// 2 done
State int