開發環境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,有如下提示
- worker程序可能需要等待,因為最後一個mapworker沒有完成任務,為了避免忙等,可以設定time.sleep()或者條件變量
- master需要掌握worker的工作時間,超過一定時間(lab建議10s)後重新排程任務
- 如果worker出現crash,應當確定它寫入的臨時檔案不會被别的worker讀取(因為是殘缺檔案),是以可以使用ioutil.TempFile建立臨時檔案并且使用os.Rename自動重命名