悟懂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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...