作者:suibian | 来源:互联网 | 2024-11-18 12:05
前言:本文由编程笔记#小编整理,旨在帮助读者深入了解 MIT 6.824 课程中的 MapReduce 实验,提供详细的开发指南和实践建议。
MIT 6.824 MapReduce 实验
Lab1 MapReduce
一、实验介绍
本实验的目标是使用 Go 语言构建一个 MapReduce 库,并实现一个具备容错能力的分布式系统。实验分为两个部分:首先,实现一个简单的 MapReduce 程序;其次,编写一个 Master 节点,用于管理和调度 Worker 节点,并处理节点故障。库的接口设计和容错机制参考了 MapReduce 论文中的描述。
二、环境搭建
1. 安装 Golang
确保你的系统已安装最新版本的 Golang。可以通过官方文档获取安装指南。
2. 安装 Git
Git 是版本控制工具,用于克隆项目代码。确保已安装并配置好 Git。
3. 配置代理
如果你在使用代理网络,需要配置 Git 和 Go 的代理设置,以便顺利下载依赖包。
git config --global http.proxy http://username:password@proxy:8080
git config --global https.proxy https://username:password@proxy:8080
如果遇到 SSL 证书问题,可以尝试关闭 SSL 验证:
git config --global http.sslVerify false
4. 安装 VSCode 插件
在 VSCode 中安装 Go 插件,以便更好地进行代码编辑和调试。
三、实验说明
MapReduce 实现支持两种操作模式:顺序执行和分布式执行。前者是指依次执行每个任务,直到所有 Map 任务完成后才开始 Reduce 任务。程序源码位于 mapreduce 目录下,通过调用 master.go 启动作业,可以选择顺序执行或分布式执行。
程序执行流程如下:
- 输入参数包括:输入文件、Map 函数、Reduce 函数和 Reduce 任务数量
- 启动 RPC 服务器(master_rpc.go),等待 Worker 节点注册(master.go -> register)
- schedule.go -> schedule() 决定如何分配任务给 Worker 节点,并处理节点故障
3.1 编写 MapReduce 输入和输出
$ cd src/mapreduce
$ go test -run Sequential
$ go test -v -run Sequential // 调试模式(将 common.go 中的 debugEnabled 改为 true)
修改 src/mapreduce 目录下的 common_map.go 中的 doMap() 函数和 common_reduce.go 中的 doReduce() 函数。
doMap() 函数实现:
- 读取输入文件,根据 Reduce 任务数量(nReduce)生成相应数量的中间文件
- 文件命名格式为 mrtmp.[jobName]-[mapTaskNum]-[reduceTaskNum],例如 mrtmp.test-0-0
doReduce() 函数功能:
- 读取 doMap() 生成的中间文件
- 将 nMap 个文件合并、排序并输出
- 输出文件名为 mrtmp.[jobName]-res-[reduceTaskNum],例如 mrtmp.test-res-0
3.2 实现 MapFunc 和 ReduceFunc
实现 src/main/wc.go 中的 MapF() 和 ReduceF() 函数。
MapF(inputfile string, contents string) 功能:
- inputfile 是输入文件名,无需特别处理
- contents 为输入文件的内容,使用 strings.FieldsFunc 进行分词
- 代码示例:
words := strings.FieldsFunc(contents, func(c rune) bool {
return !unicode.IsLetter(c)
})
var result = make([]mapreduce.KeyValue, 0)
for _, w := range words {
kv := mapreduce.KeyValue{w, "1"}
result = append(result, kv)
}
ReduceF(key string, values []string) 功能:
- key 代表每个键的内容
- values 是 key 对应的值列表
- 实现:统计 value 的总数
- 代码示例:
count := strconv.Itoa(len(values))
return count
3.3 分布式 MapReduce 任务
schedule() 函数通过读取 registerChan 获取 Worker 节点集合,并进行任务分配和故障处理。