天天看點

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 了

MIT 6.824 分布式系統 lab1 MapReduce 遇到的問題

5、後面我又修改了思路,之前的設計是mapworker和reduceworker可以并行,輸出R個分區檔案。可以這樣設計一個sync.waitgroup 條件變量,使所有mapworker全部完成任務後再進行reduce任務,所有的reduceworker輸出在同一個檔案裡,不需要合并。結果如下

MIT 6.824 分布式系統 lab1 MapReduce 遇到的問題

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自動重命名

繼續閱讀