MapReduce 經典案例手機流量排序的分析

2022-07-26 15:12:14 字數 3568 閱讀 7734

在進行流量排序之前,先要明白排序是發生在map階段,排序之後(排序結束後map階段才會顯示100%完成)才會到reduce階段(事實上reduce也會排序),.此外排序之前要已經完成了手機流量的統計工作,即把第一次mr的結果作為本次排序的輸入.也就是說讀取的資料格式為     手機號 上行流量 下行流量 總流量

1,map階段,讀取並封裝流量資訊,不同的是context.write()時key必須是封裝的實體類,而不再是手機號

1

/**2

* 輸入key 行號

3* 輸入value 流量資訊

4* 輸出key 封裝了流量資訊的flowbean

5* 輸出value 手機號6*

@author

tele7*

8*/9public

10 flowbean flow = new

flowbean();

11 text v = new

text();

12//

讀取的內容格式 手機號 上行流量 下行流量 總流量

13@override

14protected

15throws

ioexception, interruptedexception

35 }

2.map之後會根據key進行排序,因此如果要實現自定義排序,必須讓定義的bean實現writablecomparable介面,並重寫其中的compare方法,我們只需要告訴mapreduce根據什麼排序,公升序還是降序就可以了

具體的排序過程由mapreduce完成

1

public

class flowbean implements writablecomparable

6public

void setupflow(long

upflow)

9public

long

getdownflow()

12public

void setdownflow(long

downflow)

15public

long

getsumflow()

18public

void setsumflow(long

sumflow)

21private

long

downflow;

22private

long

sumflow;

2324

/**25

* 反序列化時需要通過反射呼叫空參構造方法.必須有空參構造

26*/

27public

flowbean()

3031

public flowbean(long upflow, long

downflow)

3738

public

void set(long upflow, long

downflow)

4344

45/**

46* 序列化與反序列化順序必須一致

47*/

4849

50//

序列化51

@override

52public

void write(dataoutput output) throws

ioexception

5859

60//

反序列化

61@override

62public

void readfields(datainput input) throws

ioexception

6768

/**69

* reduce context.write()會呼叫此方法

70*/

71@override

72public

string tostring()

7576

77@override

78public

intcompareto(flowbean o)

8283 }

3.reduce階段,map階段會對輸出的value根據key進行分組,具有相同key的value會被劃分到一組,這樣reduce階段執行一次reduce()讀取一組,由於map階段輸出的key是定義的flowbean,因此key是唯一的,從而

每組只有乙個值,即iterablevalue中只有乙個值,也就是只有乙個手機號

1

/**2

* 輸出的格式仍然為 手機號 上行流量 下行流量 總流量3*

@author

tele4*

5*/6public

class flowsortreducer extends reducer

22 }

下面進行debug,在map(),reduce()方法的開始與結束均打上斷點,在flowbean的compareto()中也打上斷點

map讀取的內容

寫出,注意key是flowbean物件

接下來是排序,可以看到排序時map仍然不是100%,也就是說map階段進行了排序(reduce階段也會進行排序)

排序之後進入reduce階段,reduce時write會呼叫flowbean的tostring()把結果輸出到磁碟上

reduce除了歸併排序之外,在執行write時同樣會進行一次排序,執行第一組的write,(會呼叫flowbean的tostring()).但接下來還會去執行compareto方法,此時在磁碟上生成的是臨時目錄,並且生成的part000檔案是0kb,在執行完第二組的write之後才會真正把第一組資料寫出到磁碟上

part000此時有了資料

這樣看來我們重寫的compareto方法無論在map階段還是reduce階段都被呼叫了

MapReduce案例 統計手機號總流量

map方法和reduce方法都是迴圈呼叫的 map方法 每行資料呼叫一次 reduce方法 每個kv呼叫一次 只執行一次的 寫在setup和cleanup中 資料格式 1363157985066 13726230503 00 fd 07 a4 72 b8 cmcc 120.196.100.82 i0...

MapReduce案例 好友推薦

用過各種社交平台 如qq 微博 朋友網等等 的小夥伴應該都知道有乙個叫 可能認識 或者 好友推薦 的功能 如下圖 它的演算法主要是根據你們之間的共同好友數進行推薦,當然也有其他如愛好 特長等等。共同好友的數量越多,表明你們可能認識,系統便會自動推薦。今天我將向大家介紹如何使用mapreduce計算共...

MapReduce經典樣例

目錄 mapreduce核心思想是分治 以下樣例只涉及基礎學習和少量資料,並不需要連線虛擬機器 以下樣例均可在系統建立的資料夾的part r 0000中檢視結果 在檔案輸入一定數量單詞,統計各個單詞出現次數 package qfnu import j a.io.ioexception import ...