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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...