MIT6.824 2017課程作業(yè)的lab1鞠值,使用go語(yǔ)言實(shí)現(xiàn)mapreduce阳准】ト框架代碼來(lái)自 git://g.csail.mit.edu/6.824-golabs-2017,完整實(shí)現(xiàn)代碼見(jiàn)https://github.com/shishujuan/mit6.824-2017-mapreduce
1 基礎(chǔ)概念
map 負(fù)責(zé)分發(fā)贺奠。每個(gè)map任務(wù)通常處理一個(gè)文件,有多少個(gè)輸入文件就有多少個(gè)map任務(wù)隆嗅。而輸出則根據(jù)reduce的數(shù)目確定有多少個(gè)輸出界阁。注意,相同的key肯定是輸出到同一個(gè)reduce文件中胖喳,通過(guò)哈希算法來(lái)確認(rèn)一個(gè)key應(yīng)該分發(fā)到哪個(gè)中間文件泡躯。targetReduct = ihash(key) % nReduce。
總的中間文件數(shù)為 nMap * nReduce
reduce負(fù)責(zé)對(duì)map輸出的文件進(jìn)行處理丽焊,每個(gè)reduce處理自己負(fù)責(zé)的那些中間文件较剃。負(fù)責(zé)處理的中間文件名可以由map個(gè)數(shù)和reduce number來(lái)確認(rèn)。
2 代碼實(shí)現(xiàn)
原始代碼有兩個(gè)目錄:main和mapreduce技健。其中main目錄下只需要關(guān)注wc.go写穴,ii.go以及一系列的txt文件
。 mapreduce目錄則需要修改schedule.go
雌贱,common_map.go
和common_reduce.go
文件啊送。
Part 1, Part 2
這兩個(gè)實(shí)驗(yàn)都比較簡(jiǎn)單欣孤,單機(jī)的馋没。Part 1實(shí)現(xiàn)common_map.go和common_reduce.go中的通用函數(shù),而Part 2也只是統(tǒng)計(jì)單詞數(shù)目降传。Part 2這里要注意的是篷朵,要使用實(shí)驗(yàn)文檔中說(shuō)的分割方法unicode.IsLetter()
去分割單詞,不然測(cè)試會(huì)無(wú)法通過(guò)搬瑰。
Part 3
采用的分布式執(zhí)行任務(wù)款票。先是master啟動(dòng)rpc服務(wù)控硼,并調(diào)用schedule函數(shù)執(zhí)行Task泽论。注意的是,Worker啟動(dòng)后需要調(diào)用master的RPC方法Register注冊(cè)到master卡乾,而master發(fā)現(xiàn)有了新的worker翼悴,會(huì)通知等待channel的協(xié)程進(jìn)行任務(wù)操作,同一個(gè)worker需要處理多個(gè)任務(wù)幔妨,但是不能同時(shí)給一個(gè)worker分配多個(gè)任務(wù)鹦赎。
注意在run中,先做map任務(wù)误堡,做完map再做reduce古话。所以在多個(gè)worker做map任務(wù)的時(shí)候,需要等所有的map任務(wù)完成再繼續(xù)reduce任務(wù)锁施。這里用了 WaitGroup
陪踩。
另外杖们,分配worker的算法要注意,是每次有新的可能會(huì)分配到肩狂,而老的worker如果執(zhí)行完了一次任務(wù)摘完,則也要放回channel中以重復(fù)使用。
Part 4
worker失敗的情況下的實(shí)驗(yàn)傻谁,也比較簡(jiǎn)單孝治,在每個(gè)任務(wù)執(zhí)行時(shí)加個(gè)for循環(huán),如果成功則退出审磁,否則重新取worker執(zhí)行任務(wù)谈飒。
Part 5
Part 5需要完成一個(gè)倒排索引,完成ii.go即可态蒂,跟wc.go類似步绸,主要是要去掉重復(fù)以及對(duì)倒排列表排序就可以通過(guò)測(cè)試了。