天天看點

大資料實戰:使用者流量分析系統

---------------------------------------------------------------------------------------------------------------

[版權申明:本文系作者原創,轉載請注明出處]

作者:朱培

本文是結合hadoop中的mapreduce來對使用者資料進行分析,統計使用者的手機号碼、上行流量、下行流量、總流量的資訊,同時可以按照總流量大小對使用者進行分組排序等。是一個非常簡潔易用的hadoop項目,主要使用者進一步加強對MapReduce的了解及實際應用。文末提供源資料采集檔案和系統源碼。

本案例非常适合hadoop初級人員學習以及想入門大資料、雲計算、資料分析等領域的朋友進行學習。

以下是一個待分析的文本檔案,裡面有非常多的使用者浏覽資訊,保擴使用者手機号碼,上網時間,機器序列号,通路的IP,通路的網站,上行流量,下行流量,總流量等資訊。這裡隻截取一小段,具體檔案在文末提供下載下傳連結。

大資料實戰:使用者流量分析系統

想要統計出使用者的上行流量、下行流量、總流量資訊,我們需要建立一個bean類來對資料進行封裝。于是建立應該Java工程,導包,或者直接建立一個MapReduce工程。在這裡面建立一個FlowBean.java檔案。

然後就是各種右鍵生成get,set方法,還要toString(),以及生成構造函數,(千萬記得要生成一個空的構造函數,不然後面進行分析的時候會報錯)。

完整代碼如下:

然後就是這個統計的代碼了,建立一個FlowCount.java.在這個類裡面,我直接把Mapper和Reduce寫在同一個類裡面了,如果按規範的要求應該是要分開寫的。

在mapper中,擷取後面三段資料的值,是以我的這裡length-2,length-3.

在reduce中隊資料進行整理,統計

最後在main方法中調用執行。

當然啦,還需要先在你的hdfs根目錄中建立/flow/data資料,然後我那個使用者的資料源上傳上去。

把上面這個MapReduce工程打包成一個jar檔案,然後用hadoop來執行這個jar檔案。例如我放在~/hadoop/lx/flow.jar,然後再hadoop安裝目錄中執行

最後執行結果如下:

大資料實戰:使用者流量分析系統

在這整過過程中,我們是有yarnchild的程序在執行的,如下圖所示:當整個過程執行完畢之後yarnchild也會自動退出。

大資料實戰:使用者流量分析系統

如果你上面這個基本操作以及完成了的話,按總流量排序就非常簡單了。我們建立一個FlowCountSort.java.

全部代碼如下:

這個主要就是使用了FlowBean.java中的代碼來實作的,主要是繼承了WritableComparable<FlowBean>接口來實作,然後重寫了compareTo()方法。

按照同樣的方法對這個檔案打成jar包,然後使用hadoop的相關語句進行執行就可以了。

結果圖:

大資料實戰:使用者流量分析系統

流量彙總之後的結果需要按照省份輸出到不同的結果檔案中,需要解決兩個問題:

 1、如何讓mr的最終結果産生多個檔案: 原理:MR中的結果檔案數量由reduce

  task的數量絕對,是一一對應的 做法:在代碼中指定reduce task的數量

  2、如何讓手機号進入正确的檔案 原理:讓不同手機号資料發給正确的reduce task,就進入了正确的結果檔案

  要自定義MR中的分區partition的機制(預設的機制是按照kv中k的hashcode%reducetask數)

  做法:自定義一個類來幹預MR的分區政策——Partitioner的自定義實作類

主要代碼與前面的排序是非常類似的,隻要在main方法中添加如下兩行代碼就可以了。

這裡我們需要建立一個ProvincePartioner.java來處理号碼分類的邏輯。

執行方法和前面也是一樣的。從執行的流程中我們可以看到這裡啟動了5個reduce task,因為我這裡資料量比較小,是以隻啟動了一個map task。

大資料實戰:使用者流量分析系統

到這裡,整個使用者流量分析系統就全部結束了。關于大資料的更多内容,歡迎關注。點選左上角頭像下方“點選關注".感謝您的支援!