这个Lab并不是真的让我们去实现MapReduce的分布式并行框架,而是通过本地开启不同的进程(线程),去模拟集群执行MapReduce程序。
课程相关文献
建议优先使用官方的相关资料,进行完成课程,本文章仅供参考。
- MIT 6.824 分布式系统课程官网mit 6.824 Distributed Systems
- MIT6.824 分布式系统 MapReduce 实验1mit 6.824 Lab1 MapReduce
- 谷歌MapReduce论文MapReduce Paper
源代码
https://gitee.com/eddievim/eddievim_-mit6.824_lab
定义角色
-
Master(调度)
-
Worker(进行具体的Map、Reduce)(默认初始化3个)
流程
- 通过Master角色接收到用户传进来的文件路径,找到需要进行MapReduce处理的原始文件。
- 我们这边简单对输入进行任务切分(一个文件对应一个MapTask)。
- 若输入文件有M个,则开启M个MapTask,Master调度Worker来领取任务并执行Map;
- Map执行后的结果需要进行排序,并写到磁盘中去;
- Shuffle :将MapTask的输出,改造成ReduceTask的输入。
- 直至所有MapTask全部执行完毕后,开启ReduceTask,ReduceTask的任务是到读取MapTask产生的磁盘文件中,抓取出对应分区的Key出来,再将相同的Key与List(value)执行Reduce方法,得出结果后,最终再将结果写出到结果文件中。
初始化工作
定义各种数据结构,及数据的交换格式。
状态的定义
-1: TaskWait
0: JobOver
1: MapPhrase
2: ReducePhrase
const TaskWait, JobOver, MapPhrase, ReducePhrase = -1, 0, 1, 2
Master
type Master struct {
Phrase int // 用于定义当前阶段
NReduce int // ReduceTask并行度
NMap int // MapTask并行度
MapTaskQueue chan MapTask // 用于存储MapTask的队列,线程安全
ReduceTaskQueue chan ReduceTask // 用于存储ReduceTask的队列,线程安全
MapOutFilePaths [][]string // MapTask输出的路径
ReduceOutFilePaths []string // ReduceTask输出的路径
mutex sync.Mutex // 锁,用于防止并发问题的产生
}
MapTask
type MapTask struct {
No int // 编号
Filepath string
}
ReduceTask
type ReduceTask struct {
No int // 编号
Filepaths