1. 程式人生 > >MIT 6.824 Lab1 mapreduce

MIT 6.824 Lab1 mapreduce

這學期選了分散式計算這門課。

不得不說真的是一門有料的課程。所有的東西講的都是MIT 6.824上的,Lab也是一樣。

不過乾貨太多帶來的也就是,需要花費比較多的時間去看資料和寫程式碼。

但是我喜歡這種感覺。

課程網址是    http://nil.csail.mit.edu/6.824/2016/schedule.html

Lab1 是mapreduce的一個實驗

花了我大概一天多的時間,主要是有時不太瞭解go語言的特性,以及沒有很好的理解lab的意思。

不過確實Lab1主頁上描述的不多,很多東西mapreduce那篇論文講的也並沒有那麼細緻,有時就需要看程式碼去猜測了

還好程式碼基本流程都差不多能看明白。

首先最蛋疼的地方在於Go語言的一些特性

最煩的地方就是unused variable 會報錯, import的包沒使用也報錯,這就使得改程式碼需要更細緻,更麻煩, 

而程式碼中又有無數個地方需要返回異常,這就搞的超級麻煩,而且這樣debug也費勁...

然後go還有channel,goroutine這些東西,都是需要了解掌握的。

很多時間都花費在瞭解go語言,括怎麼讀寫檔案我都糾結了好久,不過在Lab1裡的意圖是讓用json格式來讀寫檔案的,

這裡註釋裡有例子,使用json.NewEncoder和json.NewDecoder, 會一行一條記錄的寫json或者讀json。剛開始我沒仔細看,

就用了各種奇怪的方式寫檔案,最後發現都不符合要求還特別麻煩,在這裡浪費了巨多時間...

然後實驗有5個步驟。剛開始是序列的,後面都是並行的。

邏輯一定要清晰,不然會很蛋疼。

需要注意的是:

1)每個map任務對一個檔案操作,產生nReduce個檔案。 nMap個任務會產生 nMap * nReduce個檔案。這些檔案的名稱會有專門的函式來指定

2)採用ihash函式進行hash的目的是為了讓同一個word永遠分給指定序號的reducer,這樣好並行。

3)每個reduce任務會操作nMap個檔案,把所有分給自己的word進行彙總,輸出到一個檔案。 nReduce個任務產生nReduce個檔案,這些檔案的名稱也會有專門的函式來指定

4) 所有reduce任務完成了,系統會使用merge將nReduce個檔案合併。這個merge函式已經寫好了,不能亂改。

5)   可以觀察到reduceF中的value引數是string陣列, 而key value對都是string,也就是doReduce的時候,實際上會把某個key的所有value append到一個數組裡,

一般而言這些value都是"1", 最後陣列長度就是詞的頻次。 這裡要靈活使用map... ,比方說string對映成了一個string陣列。

6) 考慮多機的時候,可以看到master結構體裡的channel變數,有一個專門用來存放空閒的機器名稱。於是我們可以使用goroutine和channel配合來完成排程。

假設我們現在分發doMap任務,顯然我們發完一個任務不能在那等任務完成再發下一個,所以對每個doMap任務,開一個goroutine,去獲取空閒的worker,

讓woker幹活,幹活完再讓他回到空閒佇列,而我們的主執行緒,就只需要等所有人幹完活就可以了。這裡會有一些使用channel的技巧。

暫時想了這麼多,這些點都是我走過彎路的地方,主要也是有時候沒好好看要求,胡寫瞎寫,加上不熟悉go語言導致的

程式碼就不貼了,仔細想想還是挺有意思的, 一看程式碼就沒想象空間了,實驗做完會覺得其實真的很簡單...。