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