3.MR

dededea發表於2024-09-10

MR

一.MR概述

1.mr定義

Mr是一個分散式運算程式的程式設計框架,是使用者開發”基於hadoop的資料分析應 用”的核心框架

Mr核心功能是將使用者編寫的業務邏輯程式碼和自帶預設元件整合成一個完整地 分散式運算程式,併發執行在一個hadoop叢集上

2.mr優缺點

2.1.優點

(1)易於程式設計.使用者只關心業務邏輯.實現框架的介面

(2)良好擴充套件性:可以動態增加伺服器,解決計算資源不夠問題

(3)高容錯性.任何一臺機器掛掉,可以將任務轉移到其它節點

(4)適合海量資料計算(TB/PB).幾千臺伺服器共同計算

2.2.缺點

(1)不擅長實時計算.mysql

(2)不擅長流式計算.sparkstreaming flink

(3)不擅長dag有向無環圖計算.spark

3.mr核心思想

3.MR

4.mr程序

一個完整的mr程式在分散式執行時有三類例項程序:

A.mrappmaster:負責整個程式的過程排程及狀態協調

B.maptask:負責map階段的整個資料處理流程

C.reducetask:負責reduce階段的整個資料處理流程

5.官方wordcount原始碼

採用反編譯工具反編譯原始碼,發現wordcount案例有map類,reduce類和驅動類. 且資料型別是hadoop自身封裝的序列化型別

6.常用資料序列化型別

3.MR

7.mr程式設計規範

使用者編寫的程式分為三個部分:mapper,reducer和driver

(1)mapper階段

A.使用者自定義的mapper要繼承自己的父類

B.mapper的輸入資料時kv對的形式(kv型別可自定義)

C.mapper中的業務邏輯寫在map()方法中

D.mapper的輸出資料時kv對的形式(kv的型別可自定義)

E.map()方法(maptask程序)對每一個<k,v>呼叫一次

(2)reducer階段

A.使用者自定義的reducer要繼承自己的父親

B.reducer的輸入資料型別對應mapper的輸出資料型別,也是kv

C.reducer的業務邏輯寫在reduce()方法中

D.reduceTask程序對每一組相同k的<k,v>組呼叫一次reduce()方法

(3)driver階段

相當於yarn叢集的客戶端,用於提交我們整個程式到yarn叢集,提交的是 封裝了mapreduce程式相關執行引數的job物件

8.wordcount實操

8.1本地測試

(1)需求

在給定的文字檔案中統計輸出每一個單詞出現的總次數

A.輸入資料

B.期望輸出資料

(2)需求分析

按照要求,分別編寫mapper,reducer,driver

3.MR

(3)環境準備

A.建立maven工程

B.在pom.xml中新增如下依賴

3.MR

C.在專案的src/main/resources目錄下,新建一個資料夾,命名 為”log4j.properties”,在檔案中填入

3.MR

D.建立包名:com.shujia.mapreduce.wordcount

(4)編寫程式

A.編寫Mapper類

3.MR

B.編寫Reducer類

3.MR

C.編寫Driver類

3.MR

(5)本地測試

A.需要首先配置好HADOOP_HOME變數以及Windows執行依賴

B.在IDEA/Eclipse上執行

8.2提交到叢集測試

(1)用maven打jar包,需要新增的打包外掛依賴

3.MR

(2)將程式打成jar包

3.MR

8.3遠端提交叢集測試

(1)將jar包匯入虛擬機器輸入命令

3.MR

(2)檢視結果

3.MR

二.Hadoop序列化

1.序列化概述

(1)什麼是序列化

序列化就是把記憶體中的物件,轉換成位元組序列(或其他資料傳輸協議)以便 於儲存到磁碟(持久化)和網路傳輸

反序列化就是將收到位元組序列(或其他資料傳輸協議)或者是磁碟的持久 化資料,轉換成記憶體中的物件

(2)為什麼要序列化

一般來說,”活的”物件只生存在記憶體裡,關機斷電就沒有了.而且”活的”物件 只能由本地的程序使用,不能被髮送到網路上的另一臺計算機.然而序列化 可以儲存活的物件,可以將活的物件傳送到遠端計算機

(3)為什麼不用java的序列化

Java的序列化是一個重量級序列化框架,一個物件被序列化後,會附帶很多 額外資訊(各種校驗資訊,header,繼承體系等),不便於在網路中高效傳輸.

3.MR

2.自定義bean物件實現序列化介面(Writable)

在企業開發中往往常用的基本序列化型別不能滿足所有需求,比如在hadoop 框架內部傳遞一個bean物件,那麼該物件就需要實現序列化介面

具體實現bean物件序列化步驟如下7步

(1)必須實現Writable介面

(2)反序列化時,需要反射呼叫空參建構函式,所以必須有空參構造

3.MR

(3)重寫序列化方法

3.MR

(4)重寫反序列化方法

3.MR

(5)注意反序列化的順序和序列化的順序和完全一致

(6)要想把結果顯示在檔案中,需要重寫toString(),可用”\t”分開,方柏霓後續使用

(7)如果需要將自定義的bean放在key中傳輸,則還需要實現Comparable介面, 因為Mapreduce框中的shuffle過程要求對key必須能排序

3.MR

3.序列化實操

三.MR框架原理

3.MR

1.輸入資料inputformat

1.1.切片與maptask並行度決定機制

(1)問題引出

Maptask的並行度決定map階段的任務處理併發度,進而影響整個job 的處理速度

思考:1G的資料,啟動八個maptask,可以提高叢集的併發處理能力.那 麼1k的資料,也啟動八個maptask,會提高叢集效能嗎?maptask並行任 務是否越多越好?哪些因素影響了maptask並行度

(2)maptask並行度決定機制

資料塊:block是hdfs物理上把資料分成一塊一塊.資料塊是hdfs儲存 資料單位

資料切片:資料切片只是邏輯上對輸入進行分片,並不會在磁碟上將其 切分成片進行儲存.資料切片是mapreduce程式計算輸入資料的單位, 一個切片會對應啟動一個maptask

3.MR

1.2.job提交流程原始碼和切片原始碼詳解

(1)job提交流程原始碼詳解

3.MR

3.MR

3.MR

(2)FileInputFormatq切片原始碼解析(input.getSplits(job))

A.程式先找到資料儲存的目錄

B.開始遍歷處理(規劃切片)目錄下的每一個檔案

C.遍歷第一個檔案

(a)獲取檔案大小

(b)計算切片大小

3.MR

(c)預設情況下,切片大小=blocksize

(d)開始切,形成第一個切片...

(每次切片時,都要判斷切完剩下的部分是否是大於塊的1.1 倍,不大於就劃分一塊切片)

(e)將切片資訊寫到一個切片規劃檔案中

(f)整個切片的核心過程在setSplit()方法中完成

(g)IntputSplit只記錄了切片的後設資料資訊,比如起始位置,長度以 及所在的節點列表等

D.提交切片規劃檔案到yarn上,yarn上的mrappmaster就可以根據切 片規劃檔案計算開啟maptask個數

1.3.fileinputformat切片機制

3.MR

fileinputformat切片大小的引數配置

3.MR

1.4.textinputformat

3.MR

3.MR

1.5.combinetextinputformat切片機制

3.MR

3.MR