# MapReduceLite **Repository Path**: SavenNeer/map-reduce-lite ## Basic Information - **Project Name**: MapReduceLite - **Description**: MapReduceLite - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-14 - **Last Updated**: 2023-01-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Go语言, mapreduce, rpc ## README # MR-Lab Lab1 in MIT6.824 ## MapReduceLite Design Notes * 一共存在nReduce个reduce任务,nReduce的值作为参数传入main/mrmaster.go的MakeMaster() * 第X个reduce任务在worker完成后需要将结构写入到文件mr-out-X中 * mr-out-X文件内部的格式是:"%v %v".format(Key,Value) * 本次实现只许在mr/worker.go,mr/master.go,mr/rpc.go三个文件中修改 * Map的运行结构应当直接生成在当前目录下,并在之后由Reduce读取文件 * mr/master.go文件需要实现Done()以能够通报给Master所有任务已经结束 * Worker节点也需要能够通过一定的方式得知是否已经完成任务,并自行exit * Worker向Master请求任务,Master使用尚未启动的映射任务的文件名进行响应,文件由Worker读入 * Map和Reduce函数采用插件机制实现,程序运行时读入.so动态库加载获得 * 如果修改了mr文件夹下的任何内容,都需要使用``go build -buildmode=plugin ../mrapps/wc.go``命令重新生成动态库 * 中间文件的合理命名约定是mr-X-Y,其中X是Map任务编号,Y是Reduce任务编号。 * 中间文件也是一种键值对格式的文件,可以使用Json格式的文件作为中间文件 * worker.go文件中的ihash(key)函数能够用于完成Key对Reduce任务编号的选择 * 可以适当参考mrsequential.go文件中的实现代码 * Master作为RPC服务端是并发的,所以共享的变量记得上锁 * 使用Go的race检测器,包括``go build -race``和``go run -race``。``test-mr.sh``内有一条注释展示了使用它的方法 * Worker需要实现Wait功能用于等待某些操作,可以是Worker循环Request&time.Sleep(),也可以是Worker请求的Master端在RPC响应时time.Sleep()或sync.Cond * 在最后一个Map操作结束前,任何一个Reduce操作都不能够进行,这点可以使用Wait功能实现 * 本实验要求Master需等待Worker工作10s,如果工作超时则认为该Worker死亡需要重新发布任务 * 为了测试崩溃恢复,你可以使用mrapps/crash.go中的插件,它会使Map与Reduce函数随机退出 * 因崩溃产生的部分写入的文件是不能够被用户观察到的,所以需要使用``ioutil.TempFile``生成临时文件,之后再使用``os.Rename``将其改为正式的名字 * test-mr.sh会在子文件夹main/mr-tmp中运行程序,一旦出错可以去该文件夹内寻找中间文件 ## 系统设计的要点 * Master只是管理Worker的工具,所有的Map和Reduce操作全都由Worker进行 * 中间文件的命名方式为mr-X-Y,说明单个Map函数需要在计算出Y后生成不同的中间文件方便对应的Reduce函数根据文件名称的Y值判断需要读取哪些文件,mr-X-Y文件不会被官方系统检查核对 ## 文件命名规范 * Map操作输出的文件名称:TaskRunID-M-Y.json * Reduce操作输出的文件名称:TaskRunID-R-Y.json * 系统最终结果文件名称:mr-out-Y.json * Y值将会在Map阶段被计算出:``Y = ihash(Key) % nReduce`` * Reduce任务编号为:0..nReduce-1,作为TaskID依次被发布给前来请求的Worker节点 ## 初步测试方法 * out文件夹是测试文件夹 * input文件夹中是测试所输入的txt文件 * build.sh 用于在out/中构建测试环境 * check.sh 用于整理out/中mr输出的结果文件 * test.sh 全流程构建、测试并整理测试结果 ```sh # 全流程: 构建-测试-整理 ./test.sh # # 单独构建到out/文件夹中 # ./build.sh # # 整理测试结果 # ./check.sh ```