一、简介
官方文档见网址:MIT6.824Lab1:MapReduce
1.1 Introduction
在这个lab你将搭建一个MapReduce系统。你将实现一个调用应用Map和Reduce函数并处理文件读写的worker进程,以及一个将任务分发给workers并处理失败的workers的coordinator进程。您将构建类似于MapReduce论文中的东西。(Note:这个lab用”coordinator”代替paper中的”master”。)
由于课程本身的一些声明,下面只写我的实验操作,不贴代码。详细内容(实验步骤)请看官方文档。
二、实验
2.1 准备工作及前置知识
- 安装Go 已安装
- git获取实验的基础代码
- 代码中已经給我们提供了一个简单的顺序mapreduce实现在src/main/mrsequential.go. 它在一个单个的进程中,每次一个地运行maps和reduces。代码还提供了几个MapReduce应用程序:word-count在mrapps/wc.go中,text indexer在mrapps/indexer.go中。
- mrsequential.go输出在文件mr-out-0中。输入来自文本文件pg-xxx.txt
2.2 我要做的
你的工作是实现一个分布式的MapReduce,它由两个程序组成,coordinator和worker。将只有一个coordinator进程,一个或多个worker进程并行运行。在一个真实的系统中,workers会在一组不同的机器上运行,但是在这个Lab中你将在单个机器上运行他们。workers将经由RPC与coordinator对话。每个worker进程将向coordinator请求一个任务,从一个或多个文件中读取任务的输入,执行任务,并将任务的输出写入一个或多个文件。coordinator应该注意到,如果一个worker没有在合理的时间内完成任务(在本实验中,使用10秒),则将相同的任务交给另一个worker。
对于coordinator和worker的”main”协程分别在main/mrcoordinator.go和main/mrworker.go中;不要改变这些文件。你应该在mr/coordinator.go,mr/worker.go,和mr/rpc.go中填上自己的实现。
2.3 顺序的MapReduce
顺序的MapReduce实现涉及到两个文件:/main/mrsequential.go以及/mrapps/wc.go,完成了单词计数demo
wc.go中是用户实现的Map函数和Reduce函数,Map函数以文件名和文件内容作为输入,将文件内容拆成单词”words”,对于每个单词形成<w,1>键值对,放在KeyValue结构体中,并把每个结构体放在一个名叫”kva”的slice中;Reduce函数接收key以及同一个key的所有值形成的名叫”values”的slice中,通过计算”values”的长度来获得单词计数并返回。
mrsequential.go是实现MapReduce的主线程,由于是一个顺序的MapReduce,因此只有一个进程,也就不需要调度也不需要实现容错。其中loadPlugin函数用来加载wc.so插件(注:动态库,通过在build时增加buildmode参数来编译wc.go得到,即go build -buildmode=plugin ../mrapps/wc.go),函数返回mapf以及reducef函数;mian函数中首先通过loadPlugin函数加载得到mapf以及reducef,随后读取每个输入文件,调用mapf处理每个文件,对于每个文件得到一个存放着kv对值的slice,再将每个文件得到的kv对放入名为”intermediate”slice得到中间kv对;对得到的中间kv对按键值排序;将同一键值的所有kv对作为一个分区,调用reducef函数,得到单词出现次数统计并输出到文件中。
2.4 分布式的MapReduce
我们要实现的分布式的MapReduce涉及6个go文件,分别是/mrapps/wc.go,/main/mrcoordinator.go,/main/mrworker.go,/mr/coordinator.go,/mr/rpc.go,/mr/worker.go.其中wc.go是用户实现的Map和Reduce函数,mrcoordinator.go和mrworker.go分别是coordinator和worker的main协程,这三个文件不需要修改。我们需要实现的是coordinator.go,rpc.go以及worker.go。
未完待续… …