1. 程式人生 > 其它 >MIT6.824 mapReduce lab1 reduce過程實現

MIT6.824 mapReduce lab1 reduce過程實現

技術標籤:演算法

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)))
	}

然後就是一些寫檔案的過程。