我眼中的大數據(三)——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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...