圖文詳解MapReduce工作機制

来源:https://www.cnblogs.com/ji-lei/archive/2022/06/02/16339058.html
-Advertisement-
Play Games

job提交階段 1、準備好待處理文本。 2、客戶端submit()前,獲取待處理數據的信息,然後根據參數配置,形成一個任務分配的規劃。 3、客戶端向Yarn請求創建MrAppMaster並提交切片等相關信息:job.split、wc.jar、job.xml。Yarn調用ResourceManager ...


job提交階段

1、準備好待處理文本。

2、客戶端submit()前,獲取待處理數據的信息,然後根據參數配置,形成一個任務分配的規劃。

3、客戶端向Yarn請求創建MrAppMaster並提交切片等相關信息:job.split、wc.jar、job.xml。Yarn調用ResourceManager來創建MrAppMaster,而MrAppMaster則會根據切片的個數來創建MapTask。

其中切片規劃: InputFormat(預設為TextInputFormat)通過getSplits 方法對輸入目錄中的文件進行邏輯切片,並序列化成job.split文件。預設情況下,HDFS上的一個block對應一個InputSplit,一個InputSplit對應開啟一個MapTask。

MapTask階段

1、Read階段:由RecordReader對象(預設是LineRecordReader)進行讀取,以換行符 (\n) 作為分隔符,每讀取一行數據,就返回一對<Key,Value>供Mapper使用。Key表示該行的起始位元組偏移量,Reduce表示這一行的內容。

2、Map階段: 將解析出的<Key,Value>交給用戶重寫的map()函數處理,每一行數據會調用一次map()函數。

3、Collect階段:map()函數中將數據處理完成後,一般會調用OutputCollector.collect()輸出結果。在該函數內部,它會將生成的key/value進行分區處理(調用Partitioner,預設為HashPartitioner),並寫入一個環形記憶體緩衝區中。

4、Spill階段(溢寫):當環形緩衝區的數據達到溢寫比例時(80%),會將數據溢寫到本地磁碟上,生成一個臨時文件。溢寫之前,還會對數據進行排序,必要時進行合併、壓縮操作。

5、Merge階段:當Mapper輸出全部文件後,產生多個臨時文件。MapTask將所有臨時文件以分區為單位,進行歸併排序,最終得到一個大文件,等待Reduce端的拉取。

ReduceTask階段

1、Copy階段:每個ReduceTask從各個MapTask上拉取對應分區的數據。拉取數據後先存儲到記憶體中,記憶體不夠時,再刷寫到磁碟。

2、Merge階段:在遠程拷貝數據的同時,ReduceTask啟動了兩個後臺線程對記憶體和磁碟上的文件進行合併,以防止記憶體使用過多或磁碟上文件過多。

3、Sort階段:用戶編寫的reduce()函數的輸入數據是按Key進行聚集的一組數據。為了將相同Key的數據聚在一起,Hadoop採用了基於排序的策略。由於各個MapTask已經對自己的處理結果進行了分區內局部排序,因此,ReduceTask只需對所有數據進行一次歸併排序即可。

4、Reduce階段:相同Key的一組鍵值對調用一次Reduce方法,進行聚合處理。之後通過context.write,預設以TextOutputFormat格式經RecordWriter寫入到HDFS文件中。

其中Map方法之後,Reduce方法之前的數據處理過程稱之為Shuffle

溢寫階段詳情

1、每個 MapTask都有一個環形記憶體緩衝區(預設大小為100M)用於批量收集Mapper結果,以減少磁碟IO的開銷。當緩衝區的數據達到溢寫比例時(預設為80%),溢寫線程啟動。此時MapTask仍繼續將結果寫入緩衝區,如果緩衝區被寫滿,MapTask就會阻塞直到溢出線程結束。如果數據量很小,達不到80M溢寫的話,就等所有文件都讀完後完成一次溢寫。

2、在溢寫之前,會採取快速排序演算法對緩衝區內的數據按照Key進行字典順序排序:先把數據劃分到相應的分區(Partition),然後按照key進行排序。經過排序後,相同分區的數據聚集在一起,同一分區內的數據按照key有序。

3、如果設置了Combiner 函數,則在排序後,溢寫前對每個分區中的數據進行局部聚合操作,以減輕 Shuffle 過程中網路傳輸壓力。

4、開始溢寫:按照分區編號由小到大依次將每個分區中的數據寫入任務工作目錄下的臨時文件output/spillN.out(N表示當前溢寫次數)中。每次記憶體緩衝區達到溢出閾值,就會新建一個溢出文件(spill file),當Mapper輸出全部文件時,會產生多個溢寫文件,最終會被合併成一個已分區且已排序的輸出文件。


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

-Advertisement-
Play Games
更多相關文章
  • 最近通過WPF開發項目,為了對WPF知識點進行總結,所以利用業餘時間,開發一個學生信息管理系統【Student Information Management System】。前三篇文章進行了框架搭建和模塊劃分,後臺WebApi介面編寫,以及課程管理模塊開發,本文在前三篇基礎之上,繼續深入開發學生信息... ...
  • 最近在看 C++ 的虛方法調用實現原理,大概就是說在 class 的首位置存放著一個指向 vtable array 指針數組 的指針,而 vtable array 中的每一個指針元素指向的就是各自的 虛方法,實現方式很有意思,哈哈,現在我很好奇 C# 中如何實現的。 一: C# 中的多態玩法 1. ...
  • OAuth2.0協議 在開始之前呢,需要我們對一些認證授權協議有一定的瞭解。 OAuth 2.0 的一個簡單解釋 http://www.ruanyifeng.com/blog/2019/04/oauth_design.html 理解 OAuth 2.0 https://www.ruanyifeng. ...
  • 文件系統 操作系統就是處理各種數據的,這些數據在硬碟上就是二進位,人類肯定不能直接看懂這些二進位數據,要有一個翻譯器,將這些二進位的數據還原為人類能看懂的文件形式,這個工作就是由文件系統來完成的,文件系統的目的就是實現數據的查詢和存儲,由於使用場合、使用環境的不同,Linux 有多種文件系統,不同的 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 1 簡介 FCN-4是一個應用於音頻自動標註的全捲積神經網路。使用該網路完成音頻標註任務時,首先需要使用python的音頻處理工具包Librosa提取音頻的時頻特征,針對mp3格式的音頻文件,Librosa讀取音頻文件的工作依賴音頻處理後端ffm ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 理解H橋電路的工作原理,結合前面幾個項目學習過的定時器中斷、EXTI、串口通訊等,要求通過7個按鈕控制步進電動機 ...
  • mysql -uroot -proot -h192.168.56.10 表示使用mysql的客戶端進行連接資料庫管理系統 -u後面是連接資料庫的用戶名,一般預設的情況下用戶名都是root -p後面是連接資料庫的密碼,在安裝mysql的時候自己設置的 -h表示資料庫管理系統所在的伺服器的ip地址,如果 ...
  • 一、 概述 compose 是用來定義和運行一個或多個容器(通常都是多個)運行和應用的工具。使用 compose 可以簡化容器鏡像的構建以及容器的運行。 compose 使用 YAML 文件來定義多容器之間的關係。一個 docker-compose up 就可以把完整的應用跑起來。 本質上,comp ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...