MapReduce原理
MapReduce是一種程式設計模型,用於大規模資料集(大於1TB)的平行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式程式語言裡借來的,還有從向量程式語言裡借來的特性。
它大大方便了程式設計人員在不會分散式並行程式設計的情況下,將自己的程式運行在分散式系統上。目前的軟體實作是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定並發的Reduce(歸約)函數,用來確保所有映射的鍵值對中的每一個共享相同的鍵組。
工作原理(推薦學習:Java影片教學)
#MapReduce執行流程
上圖是論文裡給的流程圖。一切都是從最上方的user program開始的,user program連結了MapReduce函式庫,實作了最基本的Map函數和Reduce函數。圖中執行的順序都用數字標記了。
1.MapReduce函式庫先把user program的輸入檔分成M份(M為使用者定義),每份通常有16MB到64MB,如圖左方所示分成了split0~4;然後使用fork將使用者進程拷貝到叢集內其它機器上。
2.user program的副本中有一個稱為master,其餘稱為worker,master是負責調度的,為空閒worker分配作業(Map作業或Reduce作業),worker的數量也是可以由用戶指定的。
3.被分配了Map作業的worker,開始讀取對應分片的輸入數據,Map作業數量是由M決定的,和split一一對應;Map作業從輸入數據中抽取出鍵值對,每一個鍵值對都會作為參數傳遞給map函數,map函數產生的中間鍵值對被緩存在記憶體中。
4.快取的中間鍵值對會被定期寫入本機磁碟,而且被分成R個區,R的大小是由使用者定義的,將來每個區會對應一個Reduce作業;這些中間鍵值對的位置會被通報給master,master負責將訊息轉發給Reduce worker。
5.master通知分配了Reduce作業的worker它負責的分區在什麼位置(肯定不止一個地方,每個Map作業產生的中間鍵值對都可能映射到所有R個不同分區),當Reduce worker把所有它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對聚集在一起。因為不同的鍵可能會對應到同一個分區也就是同一個Reduce作業(誰讓分區少呢),所以排序是必須的。
6.reduce worker遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函數,reduce函數產生的輸出會加到這個分區的輸出文件中。
7.當所有的Map和Reduce作業都完成了,master喚醒正版的user program,MapReduce函數呼叫回傳user program的程式碼。
所有執行完畢後,MapReduce輸出放在了R個分區的輸出檔中(分別對應一個Reduce作業)。使用者通常並不需要合併這R個文件,而是將其作為輸入交給另一個MapReduce程式處理。整個過程中,輸入資料是來自底層分散式檔案系統(GFS)的,中間資料是放在本機檔案系統的,最終輸出資料是寫入底層分散式檔案系統(GFS)的。而且我們要注意Map/Reduce作業和map/reduce函數的差異:Map作業處理一個輸入資料的分片,可能需要呼叫多次map函數來處理每個輸入鍵值對;Reduce作業處理一個分區的中間鍵值對,期間要對每個不同的鍵呼叫一次reduce函數,Reduce作業最終也會對應一個輸出檔。
更多Java相關技術文章,請造訪Java開發教學欄位進行學習!
以上是MapReduce原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本啟動Spring...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...
