MapReduce與Yarn 的詳細工作流程分析

来源:https://www.cnblogs.com/kocdaniel/archive/2019/10/08/11637888.html
-Advertisement-
Play Games

MapReduce詳細工作流程之Map階段 如上圖所示 1. 首先有一個200M的待處理文件 2. 切片:在客戶端提交之前,根據參數配置,進行任務規劃,將文件按128M每塊進行切片 3. 提交:提交可以提交到本地工作環境或者Yarn工作環境,本地只需要提交切片信息和xml配置文件,Yarn環境還需要 ...


MapReduce詳細工作流程之Map階段

MR一

如上圖所示

  1. 首先有一個200M的待處理文件
  2. 切片:在客戶端提交之前,根據參數配置,進行任務規劃,將文件按128M每塊進行切片
  3. 提交:提交可以提交到本地工作環境或者Yarn工作環境,本地只需要提交切片信息和xml配置文件,Yarn環境還需要提交jar包;本地環境一般只作為測試用
  4. 提交時會將每個任務封裝為一個job交給Yarn來處理(詳細見後邊的Yarn工作流程介紹),計算出MapTask數量(等於切片數量),每個MapTask並行執行
  5. MapTask中執行Mapper的map方法,此方法需要k和v作為輸入參數,所以會首先獲取kv值;
    • 首先調用InputFormat方法,預設為TextInputFormat方法,在此方法調用createRecoderReader方法,將每個塊文件封裝為k,v鍵值對,傳遞給map方法
  6. map方法首先進行一系列的邏輯操作,執行完成後最後進行寫操作
  7. map方法如果直接寫給reduce的話,相當於直接操作磁碟,太多的IO操作,使得效率太低,所以在map和reduce中間還有一個shuffle操作
    • map處理完成相關的邏輯操作之後,首先通過outputCollector向環形緩衝區寫入數據,環形緩衝區主要兩部分,一部分寫入文件的元數據信息,另一部分寫入文件的真實內容
    • 環形緩衝區的預設大小是100M,當緩衝的容量達到預設大小的80%時,進行反向溢寫
  8. 在溢寫之前會將緩衝區的數據按照指定的分區規則進行分區和排序,之所以反向溢寫是因為這樣就可以邊接收數據邊往磁碟溢寫數據
  9. 在分區和排序之後,溢寫到磁碟,可能發生多次溢寫,溢寫到多個文件
  10. 對所有溢寫到磁碟的文件進行歸併排序
  11. 在9到10步之間還可以有一個Combine合併操作,意義是對每個MapTask的輸出進行局部彙總,以減少網路傳輸量
    • Map階段的進程數比Reduce階段要多,所以放在Map階段處理效率更高
    • Map階段合併之後,傳遞給Reduce的數據就會少很多
    • 但是Combiner能夠應用的前提是不能影響最終的業務邏輯,而且Combiner的輸出kv要和Reduce的輸入kv類型對應起來

整個MapTask分為Read階段,Map階段,Collect階段,溢寫(spill)階段和combine階段

  • Read階段:MapTask通過用戶編寫的RecordReader,從輸入InputSplit中解析出一個個key/value
  • Map階段:該節點主要是將解析出的key/value交給用戶編寫map()函數處理,並產生一系列新的key/value
  • Collect收集階段:在用戶編寫map()函數中,當數據處理完成後,一般會調用OutputCollector.collect()輸出結果。在該函數內部,它會將生成的key/value分區(調用Partitioner),並寫入一個環形記憶體緩衝區中
  • Spill階段:即“溢寫”,當環形緩衝區滿後,MapReduce會將數據寫到本地磁碟上,生成一個臨時文件。需要註意的是,將數據寫入本地磁碟之前,先要對數據進行一次本地排序,併在必要時對數據進行合併、壓縮等操作

MapReduce詳細工作流程之Reduce階段

MR二

如上圖所示

  1. 所有的MapTask任務完成後,啟動相應數量的ReduceTask(和分區數量相同),並告知ReduceTask處理數據的範圍
  2. ReduceTask會將MapTask處理完的數據拷貝一份到磁碟中,併合並文件和歸併排序
  3. 最後將數據傳給reduce進行處理,一次讀取一組數據
  4. 最後通過OutputFormat輸出

整個ReduceTask分為Copy階段,Merge階段,Sort階段(Merge和Sort可以合併為一個),Reduce階段。

  • Copy階段:ReduceTask從各個MapTask上遠程拷貝一片數據,並針對某一片數據,如果其大小超過一定閾值,則寫到磁碟上,否則直接放到記憶體中
  • Merge階段:在遠程拷貝數據的同時,ReduceTask啟動了兩個後臺線程對記憶體和磁碟上的文件進行合併,以防止記憶體使用過多或磁碟上文件過多
  • Sort階段:按照MapReduce語義,用戶編寫reduce()函數輸入數據是按key進行聚集的一組數據。為了將key相同的數據聚在一起,Hadoop採用了基於排序的策略。由於各個MapTask已經實現對自己的處理結果進行了局部排序,因此,ReduceTask只需對所有數據進行一次歸併排序即可
  • Reduce階段:reduce()函數將計算結果寫到HDFS上

Shuffle機制

Map方法之後,Reduce方法之前的數據處理過程稱之為Shuffle。shuffle流程詳解如下:

  1. MapTask收集map()方法輸出的kv對,放到環形緩衝區中
  2. 從環形緩衝區不斷溢出到本地磁碟文件,可能會溢出多個文件
  3. 多個溢出文件會被合併成大的溢出文件
  4. 在溢出過程及合併的過程中,都要調用Partitioner進行分區和針對key進行排序
  5. ReduceTask根據自己的分區號,去各個MapTask機器上取相應的結果分區數據
  6. ReduceTask將取到的來自同一個分區不同MapTask的結果文件進行歸併排序
  7. 合併成大文件後,shuffle過程也就結束了,進入reduce方法

Yarn工作機制

Yarn工作機制

job提交全過程

  1. MR程式提交到客戶端所在的節點,YarnRunner向ResourceManager申請一個Application
  2. RM將該Application的資源路徑和作業id返回給YarnRunner
  3. YarnRunner將運行job所需資源提交到HDFS上
  4. 程式資源提交完畢後,申請運行mrAppMaster
  5. RM將用戶的請求初始化成一個Task
  6. 其中一個NodeManager領取到Task任務
  7. 該NodeManager創建容器Container,並產生MRAppmaster
  8. Container從HDFS上拷貝資源到本地
  9. MRAppmaster向RM 申請運行MapTask資源
  10. RM將運行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務並創建容器
  11. MR向兩個接收到任務的NodeManager發送程式啟動腳本,這兩個NodeManager分別啟動MapTask,MapTask對數據分區排序
  12. MrAppMaster等待所有MapTask運行完畢後,向RM申請容器,運行ReduceTask
  13. ReduceTask向MapTask獲取相應分區的數據
  14. 程式運行完畢後,MR會向RM申請註銷自己

進度和狀態更新:

YARN中的任務將其進度和狀態(包括counter)返回給應用管理器, 客戶端每秒(通過mapreduce.client.progressmonitor.pollinterval設置)嚮應用管理器請求進度更新, 展示給用戶

作業完成:

除了嚮應用管理器請求作業進度外, 客戶端每5秒都會通過調用waitForCompletion()來檢查作業是否完成。時間間隔可以通過mapreduce.client.completion.pollinterval來設置。作業完成之後, 應用管理器和Container會清理工作狀態。作業的信息會被作業歷史伺服器存儲以備之後用戶核查

歡迎關註下方公眾號,獲取更多文章信息

1


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

-Advertisement-
Play Games
更多相關文章
  • 本篇主要寫一些 腳本函數的使用。 數組定義 數組名=(value0 value1 vlaue2 ...) 數組名=([0]=value [1]=value [2]=vlaue ...) 列表名="value0 value1 vlaue2 ..." 數組名=($列表名) 數組名[0]="value" ...
  • 本篇主要寫一些 腳本函數的使用。 函數調用 bash !/bin/bash sum(){ s= echo $s } sum [root@localhost ~] vim sum.sh [root@localhost ~] chmod +x sum.sh [root@localhost ~] ./su ...
  • 本篇主要寫一些 腳本 語句的使用。 計算1 50的和 為指定用戶發送線上消息 bash !/bin/bash username=$1 判斷格式是否正確 if [ $ lt 1 ] ;then echo "Usage: [message]" exit 1 fi 判斷用戶是否存在 if grep "^$ ...
  • 本篇主要寫一些 腳本迴圈語句的使用。 for 迴圈 指定次數 檢查主機狀態 while 迴圈 輸出 到`10` bash !/bin/bash num=1 while [ $num le 10 ] do echo $num num= let num++ done bash !/bin/bash us ...
  • 本篇主要寫一些 腳本條件語句的使用。 條件測試 test 條件表達式 [ 條件表達式 ] 文件測試 :測試是否為目錄(Directory)。 :測試文件或目錄是否存在(Exist)。 :測試是否為文件(File)。 :測試當前用戶是否有許可權讀取(Read)。 :測試當前用戶是否有許可權寫入(Write ...
  • 本篇主要寫一些 腳本條件語句的使用。 條件測試 test 條件表達式 [ 條件表達式 ] 文件測試 :測試是否為目錄(Directory)。 :測試文件或目錄是否存在(Exist)。 :測試是否為文件(File)。 :測試當前用戶是否有許可權讀取(Read)。 :測試當前用戶是否有許可權寫入(Write ...
  • 本篇主要寫一些 腳本的基礎知識,編程規範。 第一個shell腳本 執行腳本 source . sh ./ 符號使用 管道符 和 awk 重定向輸出 重定向輸入 [root@localhost ~] rm test.txt error.log [root@localhost ~] cat error. ...
  • 1.什麼是資料庫管理系統? 資料庫管理系統是由相互關聯的數據和管理這些數據的程式組成。 2.應用 資料庫在生產生活各行各業有著廣泛的應用: (1)銀行金融(2)互聯網應用數據存儲等等等等。資料庫無所不在,無處不在 3.資料庫管理系統DBMS出現前,怎樣用來管理數據? 使用文件處理系統。主要的弊端:( ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...