大數據時代的到來,對數據的處理與分析有了很高的要求。本項目以通話數據去展現如何處理並分析大數據,並最終經過圖表可視化展現。
本項目主要分紅以下幾個部分:前端
kafka
採集kafka API
的控制檯展現】 =>HBASE
(建立命名空間,建立表,rowKey
設計,region
預分區)MapperReduce
分析 HBase
數據Mysql
中Web Server
【使用JSP+Servlet
】這個項目(Project
)由多個模塊(Modules
)構成的,這些模塊之間能夠獨立運行。全部模塊以下:
java
dataProducer
實現數據的生產ct_consumer
實現數據的消費【寫入到HBase
】ct_analysis
實現數據的分析webDisplay
實現數據的可視化MapReduce
中的 Mapper
類採起使用多個MapReduce
分析多個業務指標的方式來進行任務。
業務指標:mysql
本項目中自定義的三個輸出類分別是:git
Intimacy
Intimacy
是用於作親密度展現的MonthStat
是用於作每月每一個用戶的通話數據展現Statistics
是用於作每一個用戶每一年的通話數據展現【其實我以爲這個實體類稍顯多餘,暫且就放在這裏】mapreduce
實現類分紅三個部分,生成這些統計數據,以下github
teleDuration
teleIntimacy
teleMonthDura
analyze.fromHBToMys
包下。將分析的結果存放在mysql中。
使用到的表主要有,(這裏簡單展現以下):web
//0. 電信數據分析數據庫 create database mydatabase character set utf8; //1. 用戶基本信息表 create table user( teleNumber varchar(12) not null primary key ,name varchar(20) not null ); //2. 通話記錄分析表 drop table if exists statistics; CREATE TABLE statistics ( telenumber varchar(12) NOT NULL, callDuration int(11) NOT NULL DEFAULT '0', PRIMARY KEY (telenumber) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 //3. 親密度分析結果表 -- 親密用戶信息表,用於展示call1 的用戶在year 年時的親密用戶 drop table if exists intimacy; create table intimacy( call1 varchar(12) not null primary key, call2 varchar(12) not null , year varchar(6) not null, callDuration int not null DEFAULT 0 ); create unique index uidx_call1_call2_year on intimacy(call1,call2,year); //4. 用戶月通話數據統計表 drop table if exists monthStat; create table monthStat( teleNumber varchar(12) not null , yearMonth varchar(6) not null , callDuration int not null DEFAULT 0, primary key(teleNumber,yearMonth) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
項目具體代碼詳見個人 github。【由於涉及到關鍵字,項目暫時關閉了,後期開放再更新出來】ajax
由於須要展現的內容有不少,這裏只截圖展現部份內容sql
以下是將通話記錄寫入到 Hbase
的表以後,生成的表以及內容;
數據庫
Hbase
管理界面上的calllog
表
截取其中一個 region
進行查看,以下:
須要注意的是,這裏的分區鍵。分區鍵的內容在我博客裏有介紹,這裏再也不贅述。後端
mysql
數據庫以下
前端界面展現
程序主頁以下:
進入到項目主頁,以下:
填好參數,便可運行:
獲得的執行結果以下:
在構建這個項目時,遇到了不少問題。主要有以下幾個方面:
由於是一名大數據開發工程師,屬於後端領域,對於前端技術是的一點兒都不懂。雖然以前也曾用ASP搭建過網站,可是屬於Windows的這個技術實在不適合java。因而本身硬是學習了一遍 JSP+Servlet
,雖然這些東西也不是十分友好,可是對於解決頁面展現問題仍是綽綽有餘的。在使用 JSP+Servlet
的過程當中,主要遇到的問題有:
Session
【這個主要是應用在多個頁面之間參數的傳遞】;也用到了 Ajax
去異步的獲取值。這一部份內容,詳見個人博客列表: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
字段。
MapReduce
分析過程從HBase
讀取數據,並將數據寫到Mysql
這個過程稍有複雜,可是接觸以後就會發現其套路大體相同。這裏結合我以前的博客內容,給出以下幾個較爲基礎的實戰項目背景,結合以下幾個簡單的MapReduce
程序,就能夠看懂整個分析過程。
^_^
。