MapReduce
- MapReduce思想
- 實現思路
- 感受
6.5840/6.824 Lab與筆記匯總
本文對應的Lab版本為MIT6.5840-Spring2024的Lab1
本博客只提供思路,不會公開任何代碼
本lab耗時約6h,碼量約500行
MapReduce思想
MapReduce的思想屬于是比較簡單的,分為兩個階段:
Map階段將用戶指定的輸入文件(通常存放于分布式文件系統中,不過本Lab使用本地文件系統來代替),利用用戶編寫的map函數,將輸入文件拆分為(key,value)形式,輸出到若干個中間文件中(這些中間文件存放在map函數所運行的機器中,假設后面運行reduce函數的worker有nReduce個,那么每個運行map函數的worker,就需要把拆分出來的kv對分為nReduce個中間文件來存放,可在key上做hash來劃分kv對到對應的中間文件中)
Reduce階段將中間文件讀取出來,并按照key進行排序,然后調用用戶提供的reduce函數,將相同key的所有value進行聚合,最后輸出到文件中。假設存在nReduce個reduce任務,那么最后會產生nReduce個輸出文件。
MapReduce框架中,存在一個coordinator(論文里也叫master),用于協調map任務與reduce任務,同時,需要考慮任務crash的問題(重啟任務)。
實現思路
代碼主要分為兩部分:coordinator.go和worker.go
coordinator主要用于回應worker的rpc請求,分為兩種請求(分配任務與任務反饋)。coordinator需要維護每一個任務的狀態(可使用map),當收到分配任務的請求時,它找出一個未完成的任務并分配給worker(也是通過rpc),指定該任務的類型,并傳輸所需參數;當收到worker的任務反饋時,判斷任務是否成功,并更新任務狀態。
同時,coordinator需要監控worker,如果一個worker超過10s還沒有回復,那么認為該worker已經crash了,需要重新分配這個worker所運行的任務。
worker則是打工人,需要不斷詢問coordinator是否有任務做,對于map任務與reduce任務,進行不同的邏輯處理,按照MapReduce框架的思想進行實現就可以了。
感受
第一次使用go,2小時就可以速成,變量聲明與賦值都很方便(像python),但它是類型安全的編譯型語言,不會產生運行時的類型錯誤,寫起來非常方便。同時,不像C++一樣需要內存管理,因為存在gc機制。
當然,目前看到的只是冰山一角,還需要繼續深入學習思考。