MIT 6.824 分布式系统 lab1 MapReduce 遇到的问题

开发环境WIN10+WSL Ubuntu18.04(直接在微软商店下载使用)

1、map任务写入中间文件时为空 原因:

file, _ := os.OpenFile(intermidateFile, os.O_APPEND|os.O_RDWR, 0777)

刚开始以为openfile只需要os.O_APPEND就可以了,然而openfile的参数应该为两个os.O_APPEND和os.O_RDWR(读写与追加)

2、worker任务执行完后应该继续执行,用的for循环,然而报错dial unix /var/tmp/824-mr-0: socket: too many open files

因为没有关闭打开的文件,通过lsof  |wc -l查看打开的文件数可以发现超过了1024(linux默认的最大打开文件数)

3、刚开始对于map任务的设计是对每一个kv pair处理,打开mr-X-Y文件并处理,这样会很慢,每个mapwork要执行10分钟。所以直接打开nReduce个文件,减少文件打开次数,总共只有nReduce次打开文件操作。fileList := [10]*os.File{}//这里的10就是nReduce

4、输出结果跟MapReduce论文中提到的不一样,MapReduce论文指出一般情况下,MapReduce会将结果分摊到R个分区上,产生R个输出文件,这R个输出文件经常作为另一个MapReduce任务的输入,或者在另外一个可以处理多个分割文件的分布式应用中使用。而本lab需要整合到一个文件mr-out-0里,构造两个函数

func unionFile(filename1 string, filename2 string)

func sortFinalFile(filename string)

在done函数判定所有worker完成后由master执行

本lab中我只修改了wc_test的整合,而没有进行indexer_test的整合,不过查看生成的文件和正确文件发现是一样的,所以wctest能pass而indexer fail 了

5、后面我又修改了思路,之前的设计是mapworker和reduceworker可以并行,输出R个分区文件。可以这样设计一个sync.waitgroup 条件变量,使所有mapworker全部完成任务后再进行reduce任务,所有的reduceworker输出在同一个文件里,不需要合并。结果如下

 

6、做到这一步后后sh test-mr.sh  只有crash-test不能通过。查看hints,有如下提示

  1. worker进程可能需要等待,因为最后一个mapworker没有完成任务,为了避免忙等,可以设置time.sleep()或者条件变量
  2. master需要掌握worker的工作时间,超过一定时间(lab建议10s)后重新调度任务
  3. 如果worker出现crash,应当确保它写入的临时文件不会被别的worker读取(因为是残缺文件),所以可以使用ioutil.TempFile创建临时文件并且使用os.Rename自动重命名

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值