我眼中的大數據(三)——MapReduce

来源:https://www.cnblogs.com/hhhnicvscs/archive/2022/09/23/16722787.html
-Advertisement-
Play Games

​ 這次來聊聊Hadoop中使用廣泛的分散式計算方案——MapReduce。MapReduce是一種編程模型,還是一個分散式計算框架。 MapReduce作為一種編程模型功能強大,使用簡單。運算內容不只是常見的數據運算,幾乎大數據中常見的計算需求都可以通過它來實現。使用的時候僅僅需要通過實現Map和 ...


這次來聊聊Hadoop中使用廣泛的分散式計算方案——MapReduce。MapReduce是一種編程模型,還是一個分散式計算框架

MapReduce作為一種編程模型功能強大,使用簡單。運算內容不只是常見的數據運算,幾乎大數據中常見的計算需求都可以通過它來實現。使用的時候僅僅需要通過實現Map和Reduce介面的方式來完成計算邏輯,其中Map的輸入是一對<Key, Value>,經過計算後輸出一對<Key, Value>;然後將相同Key合併,形成<Key, Value>集合;再將這個集合輸入Reduce。

下麵,就以WordCount為例,熟悉一下MapReduce:

WordCount是為了統計文本中不用辭彙出現的次數。如果統計一篇文本的內容,只需要寫一個程式將文本數據讀入記憶體,創建一個字典,記錄每個詞出現的次數就可以了。但是如果想統計互聯網中網頁的辭彙數量,就需要用MapReduce來解決。

public class WordCount {

  public static class TokenizerMapper
       extends Mapper<Object, Text, Text, IntWritable>{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  public static class IntSumReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }
}

從上面代碼不難發現,MapReduce核心是一個map函數和一個reduce函數。map函數的輸入主要是一個<Key, Value>對,在這個例子里,Value是要統計的所有文本中的一行數據,Key在一般計算中都不會用到。map函數將文本中的單詞提取出來,針對每個單詞輸出一個<word, 1>。MapReduce計算框架會將這些<word , 1>,合併成<word , <1,1,1,1,1,1,1…>>,然後傳給reduce函數。reduce函數將這個集合里的1求和,再將word和這個sum組成一個<Key, Value>,也就是<word, sum>輸出。apReduce框架為每個數據塊分配一個map函數去計算,從而實現大數據的分散式計算。

MapReduce在運行過程中有三個關鍵進程,分別是Driver進程、JobTracker進程、TaskTracker進程。

1.Driver進程:是啟動MapReduce的主入口,主要是實現Map和Reduce類、輸入輸出文件路徑等,並提交作業給Hadoop集群,也就是下麵的JobTracker進程。

2.JobTracker進程:根據輸入數據數量,命令TaskTracker進程啟動相應數量的Map和Reduce進程,並管理整個生命周期的任務調度和監控。

3.TaskTracker進程:負責啟動和管理Map以及Reduce進程。因為需要每個數據塊都有對應的map函數,TaskTracker進程通常和HDFS的DataNode進程啟動在同一個伺服器。

JobTracker進程和TaskTracker進程是主從關係,同一時間提供服務的主伺服器通常只有一臺,從伺服器有多台,所有的從伺服器聽從主伺服器的控制和調度安排。主伺服器負責為應用程式分配伺服器資源以及作業執行的調度,而具體的計算操作則在從伺服器上完成。MapReduce的主伺服器就是JobTracker,從伺服器就是TaskTracker。

 

1.JobClient將包含MapReduce的JAR包存儲在HDFS中,將來這些JAR包會分發給Hadoop集群中的伺服器執行計算。

2.向JobTracker提交Job。

3.JobTracker根據調度策略創建JobInProcess樹,每個作業都會有一個自己的JobInProcess樹。

4.JobInProcess根據輸入數據的塊數和配置中的Reduce數目創建相應數量的TaskInProcess。

5.TaskTracker和JobTracker進行心跳通信。

6.如果TaskTracker有空閑的計算資源,JobTracker就會給它分配任務。

7.TaskTracker收到任務類型(是Map還是Reduce)和任務參數(JAR包路徑、輸入數據文件路徑),啟動相應的進程。

8.Map或者Reduce進程啟動後,檢查本地是否有要執行任務的JAR包文件,如果沒有,就去HDFS上下載,然後載入Map或者Reduce代碼開始執行。

9.如果是Map進程,從HDFS讀取數據;如果是Reduce進程,將結果寫出到HDFS。

我們僅僅是編寫一個map函數和一個reduce函數就可以了,不用關心這兩個函數是如何被分佈啟動到集群上的,也不用關心數據塊又是如何分配給計算任務的。

MapReduce框架要將一個相對簡單的程式,在分散式的大規模伺服器集群上並行執行起來卻並不簡單。理解MapReduce作業的啟動和運行機制,對理解大數據的核心原理,做到真正意義上把握大數據作用巨大。


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

-Advertisement-
Play Games
更多相關文章
  • 在上一篇:UWP/WinUI3 PixelShaderEffect 實現ThresholdEffect 濾鏡。 - 吃飯/睡覺 - 博客園 (cnblogs.com) 已經價紹瞭如何編寫hsls,編譯,和使用 PixelShaderEffect 來實現自定義濾鏡效果了,那麼本編將介紹如何編寫一個 “ ...
  • 在上一個文章中,傳送門,給大家介紹了怎麼在配置文件中使用 Kestrel 部署 Https,正好今天有小伙伴穩問到:可以通過代碼的方式實現 Kestrel 的 Https 的部署嗎?答案是肯定的,我們這次一樣去不是多個功能變數名稱。 在使用代碼實現中,我是主要使用到 ListenOptions.UseHtt ...
  • 1. 融合效果 在 CSS 中有一種實現融合效果的技巧,使用模糊濾鏡(blur)疊加對比度濾鏡(contrast)使兩個接近的元素看上去“粘”在一起,如下圖所示: 博客園的 ChokCoco 就用這個技巧實現了很多不同的玩法並寫了很多文章,例如這篇: 你所不知道的 CSS 濾鏡技巧與細節 我一直對這 ...
  • zookeeper ##協調機制 選舉leader 多個flower 客戶端 伺服器 ##特點 半數以上 數據一致性 在有限時間範圍內,執行順序同步於發送順序 文件結構類unix 樹狀每一個結點既是文件夾也可以是值。記為znode ? 本質上zookeeper 是文件系統+通知機制 ##啟動zook ...
  • 1.加拿大創新、科學和經濟發展部 (ISED) 於 2022 年 9 月 9 日發佈了第 2022-CEB001 號通知。 該通知包括關於無線電標準規範 RSS-195 “無線通信服務 (WCS) 設備在 2305-2320 MHz 和 2345-2360 MHz 頻段”第 2 版的指南,旨在重申 ...
  • 安裝MySQL版本為:8.0.16 1、首次安裝,下載命令: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz 2、解壓 tar xvJf mysql-8.0.2 ...
  • 摘要:先哲說,萬物莫不相異,而在今天,萬物也可相通。 本文分享自華為雲社區《打破聯接壁壘,華為雲IoT到底強在哪?》,作者:華為IoT雲服務。 “凡物莫不相異”, 是十七世紀哲學家萊布尼茨提出的著名論斷。這句至理名言,卻為難了今天的物聯網從業者們。 在物聯網領域內,設備的差異表現為協議不同和數據模型 ...
  • 1 DBeaver介紹 DBeaver是一個通用的資料庫管理工具和 SQL 客戶端,支持多種相容 JDBC 的資料庫。DBeaver 提供一個圖形界面用來查看資料庫結構、執行SQL查詢和腳本,瀏覽和導出數據,處理BLOB/CLOB 數據,修改資料庫結構等。 2 安裝DBeaver 下載地址:http ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...