悟懂MapReduce,不糾結!

来源:https://www.cnblogs.com/socoool/archive/2020/04/04/12629752.html
-Advertisement-
Play Games

在《谷歌 MapReduce 初探》中,我們通過統計詞頻的 WordCount 經典案例,對 Google 推出的 MapReduce 編程模型有了一個認識,但是那種認識,還只是停留在知道有那麼個模型存在,並沒有認識到骨子裡。而且上次初探,也遺留了很多猜想和疑問,這次不妨讓我們深入去認識一下 Map ...


在《谷歌 MapReduce 初探》中,我們通過統計詞頻的 WordCount 經典案例,對 Google 推出的 MapReduce 編程模型有了一個認識,但是那種認識,還只是停留在知道有那麼個模型存在,並沒有認識到骨子裡。而且上次初探,也遺留了很多猜想和疑問,這次不妨讓我們深入去認識一下 MapReduce,希望能達到一個質的認識。

重點回顧

MapReduce 主要思想是分治法。採取分而治之的思想,將一個大規模的問題,分成多個小規模的問題,把多個小規模問題解決,然後再合併小規模問題的結果,就能夠解決大規模的問題。

這麼聊下去,我感覺會讓你們很懵圈!那不妨舉點慄子,舉慄解千愁。

舉個不太恰當的慄子,不知道大家有沒有在農村掰過玉米,我小時候還沒有自動收割機,每當玉米熟了的時候,都是靠人工去掰。要是家庭里只有一個勞動力,那隻能一壠一壠的去掰;如果家庭勞動力比較多,就可以分配任務,同時去掰多壠玉米,人手一壠玉米,掰的過程放到籃子里或者地上就行,因為有專門的人手負責打包裝車,這樣很快一畝地就掰完了,而且能很快統計出掰了幾車玉米。

人多力量大,不知道大家能否感受到一絲“分而治之”的理念;多個勞動力人手一行玉米,不知道大家有沒有感覺到一絲 “MapReduce 之 Map”的概念;專門的人力負責打包裝車,不知道大家有沒有感覺到一絲“Map Reduce 之 Reduce”的概念。

再為你假設一個場景,面試的時候給你一個數組:{10,6,7,1,3,9,4,2} 要實現排序。

實現方式會有千萬種,而我們只提“歸併排序”,因為它是建立在歸併操作上的一種有效的排序演算法,並且是採用分治法(Divide and Conquer)的一個非常典型的應用。

如上圖示意,歸併排序的過程已經把分治的思想表達的很清楚了,有對演算法感興趣的可以自行深入。

一圖解千愁

為了我們更清晰的瞭解 MapReduce 的流程,懶癌犯了,就不畫圖了,肆意找了一張圖貼上。圖上字字珠璣,一定要好好揣摩要傳達的意思,切記一定要記住整個流程(重點是分區,歸併)。

重拾案例

通過上面不太恰當的例子和圖,稍微對 MapRedcue 的思想抽象了一下,不知道大家有沒有什麼感觸呢?接下來讓我們重拾上次分享提到的“WordCount”的經典案例,窺探一下具體的執行過程。

剖析背後。如圖示意,主要參與者角色分為 User Program、Master 以及系列 Worker。

User Program 顧名思義就是我們實現好的業務邏輯處理的 MapReduce 程式代碼;

Master 從圖中也能夠看出來承擔了任務分配,能夠把任務指派給 map worker 和 reduce worker(應該會存儲一些元數據,記錄哪些數據要給哪些 map worker,哪些數據要給哪些 reduce worker),猜想應該也會跟蹤維護任務的狀態;其實也就是皇上,掌控全局。

Worker 從圖中能夠看出主要分為 Map Worker、Reduce Worker。

Map Worker 從圖中也能看出來負責接收用戶的輸入,然後執行用戶實現的 map 操作,結果寫入本地中間文件。

Reduce Worker 從圖中能夠看出來能夠讀取 Map Worker 產生的中間文件,並執行用戶實現的 reduce 操作,並把結果輸出(例如寫到 GFS 存儲)。

如何運轉?這裡要提一本書《大數據技術原理與應用》,因為下麵這段剖析來自於這本書。

(1)執行 WordCount 的用戶程式(採用 MapReduce 編寫),會被系統分發部署到集群中的多台機器上,其中一臺機器作為 Master,負責協調調度作業的執行,其餘機器作為 Worker,可以執行 Map 或 Reduce 任務。

(2)系統分配一部分 Worker 執行 Map 任務,一部分 Worker 執行 Reduce 任務;MapReduce 將輸入文件切分成 M 個分片,Master 將 M 個分片分給處於空閑狀態的 N 個 Worker 來處理。

(3)執行 Map 任務的 Worker 讀取輸入文件,執行 Map 操作,生成一系列 <key,value> 形式的中間結果,並將中間結果保存在記憶體的緩衝區中。

(4)緩衝區中的中間結果會被定期刷寫到本地磁碟上,並被劃分為 R 個分區,這 R 個分區會被分發給 R 個執行 Reduce 任務的 Worker 進行處理;Master 會記錄這 R 個分區在磁碟上的存儲位置,並通知 R 個執行 Reduce 任務的 Worker 來“領取”屬於自己處理的那些分區的數據。

(5)執行 Reduce 任務的 Worker 收到 Master 的通知後,就到相應的 Map 機器上“領回”屬於自己處理的分區。不過可能會從多個 Map 機器上領取數據,因此當所有 Map 機器上的屬於自己處理的數據都已經領取回來以後,這個 Reduce 任務的 Worker 會對領取的鍵值對進行排序(如果記憶體中放不下需要用到外部排序),使得具有相同 Key 的鍵值對聚集在一起,然後就可以開始執行具體的 Reduce 操作了。

(6)執行 Reduce 任務的 Worker 遍歷中間數據,對每一個唯一 key 進行 Reduce 函數,結果寫入到輸出文件中;執行完畢後,喚醒用戶程式,返回結果。

可靠性保證?

Master 的可用性?認為 Master 掛掉幾率很小,如果掛掉任務就執行失敗。

Worker 的可用性?Master 每隔一段時間會 ping 每個 Worker,如果 Worker 長時間沒回覆,Master 就將它標記為失效。如果失效的的 Worker 執行的是 Map 任務,則需要通知對應的 reduce 的 Worker 節點去新的 Map Worker 節點拿輸入數據。

答疑解惑

針對上期遺留的問題逐個進行剖析解答。

猜想:map、reduce 函數中間感覺又觸發了“針對同一個單詞的 value 的組合(也就是把相同單詞出現的次數,串在一起)”,不然 reduce 函數怎麼能接收到 values(每個單詞對應的出現次數的一串“1”)。

這不就是歸併的事情麽!在“一圖解千愁”以及“如何運轉?”環節中均有答案!

疑問 1:map 產生的中間鍵值對,是放到記憶體、本地磁碟還是放到了 GFS 上存儲?

在“一圖解千愁”以及“如何運轉?”環節中均有答案!

疑問 2:我們寫好了 Map 函數和 Reduce 函數,怎麼就跑到了多台機器上呢?

在“如何運轉?”環節中已經有答案!

好了,這篇分享都到這兒吧,希望你們能夠喜歡,如果感覺有點幫助,那就動動手指轉發分享一下吧。


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

-Advertisement-
Play Games
更多相關文章
  • 通過VPN訪問Google時,Google仍舊無法打開,但是能訪問部分網站。這是什麼情況? 顯然能夠訪問部分網站,說明網路是正常的,經過不停的測試,我發現只要是支持HTTPS協議的網站都無法訪問,腦袋靈機一動,是不是跟HTTPS的埠443有關,檢查之後,發現果真VPN服務端的443埠沒有在防火牆 ...
  • Shell腳本殺掉除自己外的舊進程 在寫後臺Shell腳本的時候,這是比較常見的一個需求。比如之前運行了一個叫做a.sh的腳本在後臺運行,後來更新了a.sh腳本想重新運行,但卻不想手動殺掉已經存在的後臺a.sh進程。 命令其實非常簡單: 其中 是篩選出除腳本自己之外的舊進程的PID。 這裡的 做了些 ...
  • Oracle的存儲結構分為:物理存儲結構和邏輯存儲結構。 一、物理存儲結構:指硬碟上存在的文件 數據文件(data file) 一個資料庫可以由多個數據文件組成的,數據文件是真正存放資料庫數據的。一個數據文件就是一個操作系統文件。資料庫的對象(表和索引)物理上是被存放在數據文件中的。當我們要查詢一個 ...
  • 在做開發過程中經常會接觸資料庫索引,不只是DBA才需要知道索引知識,瞭解索引可以讓我們寫出更高質量代碼。簡單介紹索引的概述,聚集索引,非聚集索引,唯一索引,複合索引,篩選索引使用及註意事項 ...
  • 一、 資料庫的分類 1、SQL Server 資料庫 2、Oracle 資料庫 3、mysql 資料庫 4、DB2 5、informix 以上是比較流行的資料庫,這裡沒有一一介紹,而是展示出來以便瞭解。 二、MySQL資料庫的安裝和配置 1、如果你已經安裝了mysql ,先要卸載,再安裝。 2、先停 ...
  • 一、什麼是Presto? 背景知識:Hive的缺點和Presto的背景 Hive使用MapReduce作為底層計算框架,是專為批處理設計的。但隨著數據越來越多,使用Hive進行一個簡單的數據查詢可能要花費幾分到幾小時,顯然不能滿足互動式查詢的需求。Presto是一個分散式SQL查詢引擎,它被設計為用 ...
  • 今天一位跨界老碼農不知咋回事,興奮過了頭,一不小心把資料庫給刪掉啦,然後問我咋恢復,然後我告訴他基於 binlog 可以恢復,誰成想沒有開啟 binlog,最後只能躲在角落裡傷心。 愛情 36 技系列,好久沒更新啦,真是苦了追逐愛情系列的那些朋友們。 好了,請忘記上面的一切,因為我們的愛情故事系列又 ...
  • 谷歌“三駕馬車”的出現,才真正把我們帶入了大數據時代,並指明瞭大數據的發展方向。 GFS 作為其中一駕寶車,解決了大數據存儲的難題。它能夠把大量廉價的普通機器,聚在一起,充分讓每台廉價的機器發揮光和熱。其中在《從谷歌 GFS 架構設計聊開去》中我們針對 GFS 進行了管中窺豹,體會到其中一斑,不得不 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...