Part I: Map/Reduce input and output
完善如下函数:
common_map.go: doMap()
common_reduce.go: doReduce()
完成后测试:
cd "<project_position>/src/mapreduce"
go test -run Sequential
我们需要事先掌握如下:
- 保存读取json文件
- 文件输入输出.
- defer语句, 用于释放资源.
common_map.go: doMap()
要干什么?
- doMap()管理一个Map Task.
- 调用mapF()将输入文件的内容变成一个
[]KeyValue
. - 用划分函数将mapF()的输出划分到
nReduce
个中间文件. - 每个中间文件命由
<JobName>-<mapTask>-<reduceTask>
三部分组成.
代码构思:
- 创建
nReduce
个json文件, 将其句柄放入jsonArr
这个数组中, 其类型为[][]KeyValue
. - 读取文件将其内容转为String, 输入mapF()得到输出kvList.
- 对于kvList中每个kv, 用
index = ihash(kv.Key) % nReduce
来将其加入数组jsonArr[index]
中. - 把
jsonArr
每一个数组jsonArr[i]
保存到文件jobName-mapTask-i
中(调用reduceName(..)
). - 中间文件的格式由自己设计, 只要
doReduce()
能够正常decode就好.
common_reduce.go: doReduce()
要干什么?
-
doReduce()
管理一个reduce任务r
. - 从每一个MapTask的
ReduceTask
编号为r
的中间文件中(共nMap
个), 读取kv对, 转为String. - 将kv对按照key排序.
- 对每个不同的key调用
reduceF()
, 将输出结果写入磁盘
调用sort
包来排序, 教程.
可通过测试.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。