一.前言

最近在学Go,看完了基本语言,然后了解了Go中的特性(主要是看Go学习笔记对源码的分析,然后重点是goroutine,gc那里大概了解下),然后为了更好的实践,在wyy的安利下去学习了Mit的神课6.824分布式系统,主要是由Golang实现,正好早也想学习下分布式的东西,不过我太菜了,又是个英语菜鸡,看paper血慢,还对着翻译一点点康,用了好几天才大致完成了Lab1的实验。Lab1主要是完善一个简单的Mapreduce,课程给了大部分的代码,只要自己完成其中的一部分,这里大概记录下。

二.正文

对于Mapreduce是一个比较简单的分布式架构,是Google04年大概提出的,好像hadoop就是基于这个,不过我们这次写的当然是一个简单版的,然后具体的论文就不在这里赘述了,网上一搜一大把。这里直接进入正题

https://github.com/birdmanwings/mit6.824

(一)Part1

doMap()将文件的内容进行划分,基本流程大概是:

读入input file的内容,调用用户给的mapF,将output分为nReduce个文件。生成的临时文件名,包括map task number或者reduce task number,用提供的reduceName函数可以生成。 利用 {Key, Val} 中的 Key 值做哈希,将得到的值对 nReduce 取模,以此为依据将其分配到子文件之中

代码如下:

duReduce

(二)Part2

单词计数,论文里面一样的

(三)Part3

schedule分配任务,这里有一个坑点registerChan是个unbuffered channel当没有worker从里面读取数据时,会卡死,造成我们里面写回数据时阻塞,导致死锁,所以我们要在这里单独再开个goroutine将其挂起,避免死锁

(四)Part4

就是rpc发送失败,worker出现异常时,我们怎么处理,这里最简单的就是加个for循环无限retry

(五)Part5

实现一个反转索引,主要和part2的区别就是一个去重,还有一个排序

三.总结

Lab1还是比较简单的,继续学习了。

四.参考资料