MIT6.824 mapReduce lab1 reduce過程實現
阿新 • • 發佈:2020-12-19
技術標籤:演算法
worker
1. worker像master請求reduce任務,master分配reduce任務給worker
2. 經過map過後的檔案格式如下:mr-X-Y, where X is the Map task number, and Y is the reduce task number.
執行reduce過程時,需要對X遍歷,然後對指定的Y reduce
3. reduce演算法過程如下,使用一個map資料結構interMaps := map[string][]string{}, 實現演算法如下:
// 收集所有的key string和value []string在map中,然後傳遞給worker的reducef中 interMaps := map[string][]string{} interFileNames := []string{} for i := 0; i < nMapTask; i++ { interFileName := fmt.Sprintf("mr-%d-%d", i, reduceTaskID) interFileNames = append(interFileNames, interFileName) //留著之後刪除中間結果用 // 開啟檔案 file, err := os.Open(interFileName) if err != nil { log.Fatalf("error: Can't open interFile: %v", interFileName) } // decoder讀取資訊放入interMaps中 decoder := json.NewDecoder(file) for { var kv KeyValue // 解碼後的結果存在kv中 if err := decoder.Decode(&kv); err != nil { if err == io.EOF { break } else { log.Fatal(err) } } // 如果Key還沒有被統計過 if _, ok := interMaps[kv.Key]; !ok { interMaps[kv.Key] = []string{kv.Value} } else { // 被統計過了 interMaps[kv.Key] = append(interMaps[kv.Key], kv.Value) } } } // 遍歷interMaps使用reducef函式(引數是string,[]string)得到最終的結果,然後寫到臨時檔案中 reduceResult := []string{} tmpFileName := make([]string, 1) finalFileName := make([]string, 1) for k, v := range interMaps { reduceResult = append(reduceResult, fmt.Sprintf("%v %v\n", k, w.reducef(k, v))) }
然後就是一些寫檔案的過程。