在進行流量排序之前,先要明白排序是發生在map階段,排序之後(排序結束後map階段才會顯示100%完成)才會到reduce階段(事實上reduce也會排序),.此外排序之前要已經完成了手機流量的統計工作,即把第一次mr的結果作為本次排序的輸入.也就是說讀取的資料格式為 手機號 上行流量 下行流量 總流量
1,map階段,讀取並封裝流量資訊,不同的是context.write()時key必須是封裝的實體類,而不再是手機號
12.map之後會根據key進行排序,因此如果要實現自定義排序,必須讓定義的bean實現writablecomparable介面,並重寫其中的compare方法,我們只需要告訴mapreduce根據什麼排序,公升序還是降序就可以了/**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 }
具體的排序過程由mapreduce完成
13.reduce階段,map階段會對輸出的value根據key進行分組,具有相同key的value會被劃分到一組,這樣reduce階段執行一次reduce()讀取一組,由於map階段輸出的key是定義的flowbean,因此key是唯一的,從而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 }
每組只有乙個值,即iterablevalue中只有乙個值,也就是只有乙個手機號
1下面進行debug,在map(),reduce()方法的開始與結束均打上斷點,在flowbean的compareto()中也打上斷點/**2
* 輸出的格式仍然為 手機號 上行流量 下行流量 總流量3*
@author
tele4*
5*/6public
class flowsortreducer extends reducer
22 }
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 ...