fork from git://g.csail.mit.edu/6.824-golabs-2022
这是 MIT 6.5840 分布式系统课程的第一个实验,实现了一个简化版的 MapReduce 框架。
MapReduce 系统由以下几个主要组件组成:
- Coordinator(协调器):负责任务分配和管理
- Worker(工作节点):执行 Map 和 Reduce 任务
- RPC 系统:用于 Coordinator 和 Worker 之间的通信
整个系统的工作流程如下:
- Coordinator 初始化,加载输入文件,创建 Map 任务
- Worker 向 Coordinator 请求任务
- Coordinator 分配 Map 任务给 Worker
- Worker 执行 Map 任务,生成中间文件
- 所有 Map 任务完成后,Coordinator 创建 Reduce 任务
- Worker 执行 Reduce 任务,生成最终输出文件
- 所有 Reduce 任务完成后,整个作业结束
-
容错机制:
- 任务超时检测:如果 Worker 在指定时间内未完成任务,Coordinator 会将任务重新分配给其他 Worker
- Worker 故障处理:如果 Worker 崩溃,其任务会被重新分配
-
任务状态管理:
- 任务状态包括:空闲(Idle)、进行中(InProgress)、已完成(Completed)
- 系统阶段包括:Map 阶段、Reduce 阶段、完成阶段
-
分布式执行:
- 多个 Worker 可以并行执行任务
- 通过 RPC 进行通信
src/mr/coordinator.go
:协调器实现src/mr/worker.go
:工作节点实现src/mr/rpc.go
:RPC 定义和通信相关代码
go run mrcoordinator.go pg-*.txt
这将启动协调器,并将所有匹配 pg-*.txt
的文件作为输入。
go run mrworker.go wc.so
这将启动一个工作节点,使用 wc.so
中定义的 Map 和 Reduce 函数。你可以启动多个 Worker 来并行处理任务。
Coordinator 负责:
- 初始化 Map 和 Reduce 任务
- 分配任务给 Worker
- 监控任务执行状态
- 处理任务超时
- 管理系统阶段转换
Worker 负责:
- 向 Coordinator 请求任务
- 执行 Map 或 Reduce 任务
- 生成中间文件或最终输出文件
- 报告任务完成状态
- Worker 通过 RPC 调用
AssignTask
向 Coordinator 请求任务 - Coordinator 根据当前阶段分配 Map 或 Reduce 任务
- Worker 执行任务,生成输出文件
- Worker 通过 RPC 调用
UpdateTask
报告任务完成 - Coordinator 更新任务状态,必要时转换系统阶段
可以使用以下命令运行测试:
cd src/main
go test -run TestBasic
这将运行基本功能测试,验证系统是否正确实现了 MapReduce 功能。
- 负载均衡:可以实现更智能的任务分配策略,考虑 Worker 的处理能力
- 容错增强:增加更多的容错机制,如检查点和恢复
- 性能优化:优化中间数据的处理和传输
- MapReduce: Simplified Data Processing on Large Clusters - Google 的原始 MapReduce 论文
- MIT 6.5840 课程网站