1. 程式人生 > 資訊 >訊息稱寧德時代已在韓國設立分部,向現代汽車供貨提供支援

訊息稱寧德時代已在韓國設立分部,向現代汽車供貨提供支援

一、MapReduce概念知識

1、MapReduce概述

MapReduce是一種分散式計算模型,由Google提出,主要用於搜尋領域,解決海量資料的計算問題.
MapReduce是分散式執行的,由兩個階段組成:Map和Reduce

Map階段:一個獨立的程式,有很多個節點同時執行,每個節點處理一部分資料。Reduce階段是一個獨立的程式,有很多個節點同時執行,每個節點處理一部分資料

Reduce階段:【在這先把reduce理解為一個單獨的聚合程式即可】。
MapReduce框架都有預設實現,使用者只需要覆蓋map()和reduce()兩個函式,即可實現分散式計算,非常簡單。
這兩個函式的形參和返回值都是<key、value>

,使用的時候一定要注意構造<k,v>。


2、MapReduce原理

MapReduce分為三個階段Map階段,Suffer階段,Reduce階段

map階段

map任務處理
1.1 框架使用InputFormat類的子類把輸入檔案(夾)劃分為很多InputSplit,預設,每個HDFS的block對應一個InputSplit。通過RecordReader類,把每個InputSplit解析成一個個<k1,v1>。預設,框架對每個InputSplit中的每一行,解析成一個<k1,v1>。
1.2 框架呼叫Mapper類中的map(...)函式,map函式的形參是<k1,v1>對,輸出是<k2,v2>對

一個InputSplit對應一個map task。程式設計師可以覆蓋map函式,實現自己的邏輯
1.3
(假設reduce存在)框架對map輸出的<k2,v2>進行分割槽。不同的分割槽中的<k2,v2>由不同的reduce task處理。預設只有1個分割槽。
(假設reduce不存在)框架對map結果直接輸出到HDFS中
1.4 (假設reduce存在)框架對每個分割槽中的資料,按照k2進行排序、分組。分組指的是相同k2的v2分成一個組。注意:分組不會減少<k2,v2>數量
1.5 (假設reduce存在,可選)在map節點,框架可以執行reduce歸約。
1.6 (假設reduce存在)框架會對map task輸出的<k2,v2>寫入到linux 的磁碟檔案中。

至此,整個map階段結束

shuffle過程

1.每個map有一個環形記憶體緩衝區,用於儲存map的輸出。預設大小100MB(io.sort.mb屬性),一旦達到閥值0.8(io.sort.spill.percent),一個後臺執行緒把內容溢寫到(spilt)磁碟的指定目錄(mapred.local.dir)下的一個新建檔案中
2.寫磁碟前,要partition,sort。如果有combiner,combine排序後資料。
3.等最後記錄寫完,合併全部檔案為一個分割槽且排序的檔案

1.Reducer通過Http方式得到輸出檔案的特定分割槽的資料。
2.排序階段合併map輸出。然後走Reduce階段。
3.reduce執行完之後,寫入到HDFS中。

reduce階段

reduce任務處理
2.1 框架對多個map任務的輸出,按照不同的分割槽,通過網路copy到不同的reduce節點。這個過程稱作shuffle。
2.2 框架對reduce端接收的[map任務輸出的]相同分割槽的<k2,v2>資料進行合併、排序、分組。
2.3 框架呼叫Reducer類中的reduce方法,reduce方法的形參是<k2,{v2...}>,輸出是<k3,v3>。一個<k2,{v2...}>呼叫一次reduce函式。程式設計師可以覆蓋reduce函式,實現自己的邏輯。
2.4 框架把reduce的輸出儲存到HDFS中。
至此,整個reduce階段結束。
例子:實現WordCountApp

二、MapReduce程式碼實現

1、使用Hadoop自帶的mapreduce實現wordcount

  在Linux隨便目錄編輯檔案,寫入單行單詞若干隨機,然後上傳到hdfs上

  使用Hadoop自帶的mapreduce執行wordcount

  執行成功,在Hadoop客戶端檢視結果