大数据项目实战二之电信大数据项目
大數據項目實戰二之電信大數據項目
1.項目簡介
大數據時代的到來,對數據的處理與分析有了很高的要求。本項目以通話數據去展示如何處理并分析大數據,并最終通過圖表可視化展示。
本項目主要分成如下幾個部分:
- 生產日志【模擬通話 】
- => kafka 采集
- 【=> kafka API 的控制臺展示】 =>HBASE(創建命名空間,創建表,rowKey設計,region預分區)
- =>MapperReduce 分析 HBase 數據
- =>將分析的數據寫入到Mysql中
- => Web Server【使用JSP+Servlet】
2. 項目實現
這個項目(Project)由多個模塊(Modules)構成的,這些模塊之間可以獨立運行。所有模塊如下:
- dataProducer 實現數據的生產
- ct_consumer 實現數據的消費【寫入到HBase】
- ct_analysis 實現數據的分析
- webDisplay 實現數據的可視化
2.1 MapReduce 中的 Mapper 類
- 映射輸入的鍵值對到一組中間狀態的鍵值對。=> 將輸入狀態的鍵值對變換成中間狀態的鍵值對。
- Maps任務各不相同,它們都是將輸入的記錄轉換成中間狀態記錄。已經轉換成功的中間狀態記錄不需要和輸入記錄類型相同。一個輸入的鍵值對可能映射到0到多個輸出的鍵值對。
采取使用多個MapReduce分析多個業務指標的方式來進行任務。
業務指標:
- 用戶通話時間統計
- 用戶每月通話記錄統計,通話時間統計
- 用戶之間的親密關系統計(通話次數與通話時間體現用戶親密關系)
2.2 自定義輸出格式類
本項目中自定義的三個輸出類分別是:
- Intimacy
這個 Intimacy 是用于做親密度展示的 - MonthStat
這個MonthStat是用于做每個月每個用戶的通話數據展示 - Statistics
這個Statistics是用于做每個用戶每年的通話數據展示【其實我覺得這個實體類稍顯多余,暫且就放在這里】
2.4 mapreduce實現類
分成三個部分,生成這些統計數據,如下
- teleDuration
用于計算年通話時長 - teleIntimacy
用于計算用戶親密度 - teleMonthDura
用于計算用戶月通話時長
它們都在analyze.fromHBToMys包下。
2.5 結果存儲
將分析的結果存放在mysql中。
使用到的表主要有,(這里簡單展示如下):
3. 項目代碼
項目具體代碼詳見我的 github。【因為涉及到關鍵字,項目暫時關閉了,后期開放再更新出來】
4. 運行結果
因為需要展示的內容有很多,這里只截圖展示部分內容
-
如下是將通話記錄寫入到 Hbase 的表之后,生成的表以及內容;
-
Hbase 管理界面上的calllog表
截取其中一個 region 進行查看,如下:
需要注意的是,這里的分區鍵。分區鍵的內容在我博客里有介紹,這里不再贅述。 -
mysql 數據庫如下
-
前端界面展示
程序主頁如下:
進入到項目主頁,如下:
填好參數,即可運行:
得到的執行結果如下:
5. 項目問題
在構建這個項目時,遇到了很多問題。主要有如下幾個方面:
5.1 前端方案
因為是一名大數據開發工程師,屬于后端領域,對于前端技術是的一點兒都不懂。雖然之前也曾用ASP搭建過網站,但是屬于Windows的這個技術實在不適合java。于是自己硬是學習了一遍 JSP+Servlet,雖然這些東西也不是十分友好,但是對于解決頁面展示問題還是綽綽有余的。在使用 JSP+Servlet 的過程中,主要遇到的問題有:
- 前后端如何傳遞值?
說明白點兒,就是如何將java程序算出來的值放到jsp頁面,并且在瀏覽器中展示?這個過程我用了前端程序常用的 請求獲取;也用到了Session【這個主要是應用在多個頁面之間參數的傳遞】;也用到了 Ajax去異步的獲取值。這一部分內容,詳見我的博客列表: - Servlet程序實戰一之前端向后臺傳值
- JSP 向后臺傳遞參數的方法
- Jsp 點擊按鈕不跳轉
- jsp輸出換行
- 表單跨行,跨列實現
5.2 前端頁面不會動態刷新
JSP 頁面自身沒有刷新操作。但是在Ajax中卻是可以的。異步刷新指的就是:我在加載了一個index.jsp頁面時,即使第一次加載的時候數據還沒有準備好,卻依然可以通過ajax 將數據加載出來。但是如若通過JSP的Session或者Bean方式,就不行。這里記錄如下:
下圖是在第一次加載 telephone = 14218140347 這個用戶產生的頁面。
上面這個頁面的月通話詳情是通過ajax 獲取的;而userName,province/city等字段卻是通過Bean的方式獲取;而 startMonth,endMonth,userName則是通過頁面值傳遞獲取的。但是我們可以看到通過Bean的方式沒有將值獲取到。
接著,再次發送一次請求【刷新頁面】,如下:
接著就看到這個userName字段就獲取到了值,為何手動刷新一遍就可以獲取到值呢?原因就如上所述:ajax 是異步刷新數據,而這里的userName 則使用Session的方式。從而導致第一遍加載的時候無法出現userName 字段,但是再次刷新的時候,就出現了這個字段。 那么這個問題的解決辦法就是:在從callStatistic.jsp 時就加載這個userName,然后讓其寫入到session中,這樣在加載 statisticOne.jsp 時就可以顯示出了userName 字段。
5.3 MapReduce 分析過程
從HBase讀取數據,并將數據寫到Mysql這個過程稍有復雜,但是接觸之后就會發現其套路大致相同。這里結合我之前的博客內容,給出如下幾個較為基礎的實戰項目背景,結合如下幾個簡單的MapReduce程序,就可以看懂整個分析過程。
- Hadoop項目實戰之將MapReduce的結果寫入到Mysql
- Hadoop 項目實戰之一WordCount程序
- Hadoop項目實戰之從HBase中讀取數據
6. 總結
- 希望更多IT人參與到開源的世界中來,并貢獻自己的力量。以天下為己任,做一名真誠,正直,優秀的科技人員。【此項目的代碼鏈接在:github地址
- 有什么問題,盡管在評論區留言,我看到之后會第一時間回復。既然都看到這里了,不妨點贊+關注唄 ^_^。
總結
以上是生活随笔為你收集整理的大数据项目实战二之电信大数据项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2015/4/14课堂练习
- 下一篇: 有意思的网站