mit6.824 lab1 (2022)

来源:https://www.cnblogs.com/thotf/archive/2022/07/08/16458901.html
-Advertisement-
Play Games

lab1 要求按照論文實現一個mapReduce 框架 lab1 :https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 論文:https://zhuanlan.zhihu.com/p/122571315 在mrsequential.go文件中有個單機版 ...



 lab1 要求按照論文實現一個mapReduce 框架
 lab1 :https://pdos.csail.mit.edu/6.824/labs/lab-mr.html

  論文:https://zhuanlan.zhihu.com/p/122571315

  在mrsequential.go文件中有個單機版mapReduce實現很簡單建議閱讀。

 

 

 

整體框架流程:

  

 

 

 

 

 

 Coordinator 是協調器,負責

          ① 給woker分發任務

          ② 合併由map任務執行產生的中間文件

          ③ 任務超時重新分配任務

 

woker 是工作器,負責

        ①迴圈申請map 或reduce任務

   

 

先看woker:

  worker 向 Coordinator 發送任務申請後,判斷得到的是什麼樣類型的任務

//申請任務
for {
   args := Args{}
   args.Signal = REQUEST_WORKER

   reply := RpcCall(args)
   switch reply.STATUS {
   case COORDINATOR_MAP:    //獲得map任務
     MapHandle(&reply,mapf)
case COORDINATOR_REDUCE: //獲得reduce任務     ReduceHandle(&reply,reducef)
  case COORDINATOR__MAP_END:  //沒申請到任務重新獲取
  continue

  case END: //結束
  return
  }  

  

Recude任務
  處理方式和mrsequential.go中幾乎是一樣的不多說了。

map任務
  會從Coordinator 獲得文件名、任務id、Nreduce(中間文件個數)

 


 

 kva是通過mapf 對文件處理得到的數據。

我開啟兩個任務分發器,和Nreduce 個文件寫入器,進行併發處理數據。將數據寫入到Nreduce個中間文件中,分發依據為ihash函數。

kva := MapMachingFile(reply.FileName, mapf)
	midFileName := "mr-out-" + reply.FileName
	chanArray := make([]chan KeyValue, 10)
	for i := 0; i < 10; i++ {
		chanArray[i] = make(chan KeyValue, 10)
	}

	//開啟reduceNumber個文件寫入線程
	var w sync.WaitGroup
	var mapW sync.WaitGroup
	w.Add(reply.Neduce)
	mapW.Add(2)
	for i := 0; i < 10; i++ {
		go GoMakeMidFile(midFileName+strconv.Itoa(i), chanArray[i], &w)
	}

	// 開啟分發線程,分發數據到文件寫入線程
	lenght := len(kva)
	go MapDistributeMidData(chanArray, kva[:lenght/2], &mapW)
	go MapDistributeMidData(chanArray, kva[lenght/2:], &mapW)

	//所有分發線程結束
	mapW.Wait()
	for cIndex := 0; cIndex < 10; cIndex++ {
		close(chanArray[cIndex])
	}

	//所有文件寫入線程結束
	w.Wait()

  

 

worker結束剩下看Coordinator 。

 

 1 type Coordinator struct {
 2     filebit                    //數據分發記錄
 3     Nreduce       int
 4     midFileMergeC chan int
 5     Mergefiled             //已處理數據記錄
 6     monitorC      []chan int //監聽每個worker是否按時完成
 7     STATUS
 8     RedeceS
 9     *sync.Mutex
10     End            bool
11 }

 

Coordinator  結構記錄的信息主要為三部分
        2、3、4、5行記錄map相關
        6 為監聽chan,監聽任務是否超時
        7位Coordinator 當前的狀態,通過狀態判斷要分發map任務、reduce任務、結束



判斷worker的目的,請求任務就分發任務處理,完成map任務就將所有map產生中間數據一一對應合併到Nreduce個文件中。
//信號處理
func (c *Coordinator) SignalTask (args *Args, reply *Reply) error {
    switch args.Signal {
    case REQUEST_WORKER:
        c.distributeTask(args,reply)

    //中間文件處理
    case COMPLETE:
        c.midFileMerge(args,reply)
    }

    return nil
}

 在初始化Coordinator時,還會打開一些線程。本線程會開啟10個中間文件寫入線程,當每個worker處理完map任務後,會將自己處理的map文件相關信息傳給Coordinator,Coordinator通過chan將數據發給每個文件合併線程StartMergeFile。

舉個例子

workerMap A產生了  1,2,3 個中間文件

1號文件 合併到 mr-out-m-1

2號文件 合併到 mr-out-m-2

3號文件 合併到 mr-out-m-3

 

workerMap  B 又產生1、2、3個中間文件

1號文件 合併到 mr-out-m-1

2號文件 合併到 mr-out-m-2

3號文件 合併到 mr-out-m-3

 


//開啟Nreduce個中間文件寫入線程
//返迴文件寫入chan 切片
func (c *Coordinator)runFileWorker () []chan int {
	cLi := make([]chan int,c.Nreduce)
	for i := 0 ; i < c.Nreduce ; i ++ {
		cLi[i] = make(chan int,10)
	}

	for fid := 0 ; fid < c.Nreduce ; fid ++ {
		go c.StartMergeFile(fid,cLi[fid])
	}
	return cLi
}

  


記錄信息是否已處理的結構:
   filebit 、ReduceS 核心是通過一個簡單的bitmap實現的
type filebit struct{
	rw 		*sync.Mutex
	bitMap
	file []string
}

type RedeceS struct {
	filebit
}

  



type bitMap struct {
	bit  int16
	size int
}

//獲取一個未使用位置
func (b *bitMap) GetOne() int {
	for i := int(0) ; i < b.size ; i ++ {
		if b.isZero(i) {
			b.seTUsed(i)
			return i
		}
	}
	//這裡超過size限制會直接報錯
	return -1
}

//第i位是否為0
//為0未使用
func (b *bitMap) isZero (index int) bool {
	return ((1 << index) & b.bit) == 0
}

//設置index位已使用
func (b *bitMap) seTUsed (index int) {
	b.bit = (1 << index) | b.bit
}

func (b *bitMap) setEnUsed (index int) {
	b.bit = (0 << index) | b.bit
}

  


任務超時處理:

func (c *Coordinator) monitorWorker (id int) {
    timer := time.NewTimer(time.Duration(time.Second*10))
    select {
    case <-c.monitorC[id]:
        return
    case <-timer.C:
        //超時設置為未分配,重新分配
        c.SetEnUsed(id)
    }
}

每次分發一個任務出去,就會開啟一個線程監聽剛發送出去的任務。

當Coordinator 接收到任務完成信號,就會給任務id對應的信號監聽函數發送信息,結束監聽函數。

當未在規定時間內發送信號給監聽函數,則將當前監聽的任務id在filebit結構中標記在為未分發,重新輪循分發給下一個到來的worker。

如果這個未按時完成任務的worker後來完成任務並且發送信號過來,當這個任務已經還是為未分髮狀態則捨棄這個worker請求。

如果這個任務同時分發給了其他worker,則接收這個worker,捨棄最後來的。(這裡設計的不太好)







 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 多維數組 多維數組可以看成是數組的數組,比如二維數組就是一個特殊的一堆數組,其每一個元素都是一個一維數組 二維數組 ​ 首先看一下二維數組的定義: int arr[][]=new int[2][3] 上述定義的數組可以看成是一個2行3列的數組。 我們可以寫代碼來看一下關於二維數組的應用。 代碼示例: ...
  • 1. 線程簡介 程式:程式時指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念 進程:執行程式的一次執行過程,或是正在運行的一個程式,是一個動態的過程。由它自身的產生、存在和消亡的過程 線程是由進程創建的,是進程的一個實體。通常在一個進程中可以包含若幹個線程,當然一個進程中至少有一個線 ...
  • 日期時間的處理,是軟體開發中極其常見的場景,JAVA中與日期、時間相關的一些類與API方法也很多,這裡結合平時的編碼實踐全面的整理了下,希望可以幫助大家釐清其中的門道,更加游刃有餘的面對此方面的處理~ ...
  • 1.許可權管理-用戶管理-高級搜索-手機號搜索不可用 1.1現象 1.2解決思路 1.2.1 定位介面 介面名:system/user/list 請求方式:GET請求 1.2.3 確定bug所在位置 bug定位:在執行查詢的sql處,沒有添加手機號搜索的條件 此處沒有根據phone進行搜索 1.2.4 ...
  • python可視化案例,包含:條形圖、環形圖、折線圖、堆疊柱形圖、詞雲圖等。 ...
  • 由於網上搜索 PowerJob MapReduce 都是設計原理,demo也展示個空殼子,沒有演示Map到Reduce結果怎麼傳遞,對於沒有MR開發經驗的人來說並沒有什麼幫助,所以這裡寫了一個有完整計算意義的demo供參考。 代碼功能: 實現一個sum累加。 任務輸入參數: batchSize=10 ...
  • 因為webman是常駐記憶體框架 當前進程初始化一次後就不會再初始化了 所以構造函數里傳遞request是不好用的。 這裡使用中間件來代替 瞭解中間件: 中間件一般用於攔截請求或者響應。例如執行控制器前統一驗證用戶身份,如用戶未登錄時跳轉到登錄頁面。例如響應中增加某個header頭。例如統計某個uri ...
  • 數組 java數組是一個容器,保存著一組值,當數組創建之後,數組的的長度就固定了。 1.數組的定義 1.聲明數組 int array=null; 聲明瞭數組之後,數組是空的,沒什麼實際意義 2.創建數組 ​ array=new[10]; 3.給元素中數組賦值 array[0]=0; 註:數組的下標是 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...