大數據項目實戰二之電信大數據項目

大數據項目實戰二之電信大數據項目

1.項目簡介

大數據時代的到來,對數據的處理與分析有了很高的要求。本項目以通話數據去展現如何處理並分析大數據,並最終經過圖表可視化展現。
本項目主要分紅以下幾個部分:前端

  • 生產日誌【模擬通話 】
  • => kafka 採集
  • 【=> kafka API 的控制檯展現】 =>HBASE(建立命名空間,建立表,rowKey設計,region預分區)
  • =>MapperReduce 分析 HBase 數據
  • =>將分析的數據寫入到Mysql
  • => Web Server【使用JSP+Servlet

2. 項目實現

這個項目(Project)由多個模塊(Modules)構成的,這些模塊之間能夠獨立運行。全部模塊以下:
在這裏插入圖片描述java

  • dataProducer 實現數據的生產
  • ct_consumer 實現數據的消費【寫入到HBase
  • ct_analysis 實現數據的分析
  • webDisplay 實現數據的可視化

2.1 MapReduce 中的 Mapper

  • 映射輸入的鍵值對到一組中間狀態的鍵值對。=> 將輸入狀態的鍵值對變換成中間狀態的鍵值對。
  • Maps任務各不相同,它們都是將輸入的記錄轉換成中間狀態記錄。已經轉換成功的中間狀態記錄不須要和輸入記錄類型相同。一個輸入的鍵值對可能映射到0到多個輸出的鍵值對。

採起使用多個MapReduce分析多個業務指標的方式來進行任務。
業務指標:mysql

  • 用戶通話時間統計
  • 用戶每個月通話記錄統計,通話時間統計
  • 用戶之間的親密關係統計(通話次數與通話時間體現用戶親密關係)

2.2 自定義輸出格式類

本項目中自定義的三個輸出類分別是:git

  • Intimacy
    這個 Intimacy 是用於作親密度展現的
  • MonthStat
    這個MonthStat是用於作每月每一個用戶的通話數據展現
  • Statistics
    這個Statistics是用於作每一個用戶每一年的通話數據展現【其實我以爲這個實體類稍顯多餘,暫且就放在這裏】

2.4 mapreduce實現類

分紅三個部分,生成這些統計數據,以下github

  • teleDuration
    用於計算年通話時長
  • teleIntimacy
    用於計算用戶親密度
  • teleMonthDura
    用於計算用戶月通話時長
    在這裏插入圖片描述
    它們都在analyze.fromHBToMys包下。

2.5 結果存儲

將分析的結果存放在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;

3. 項目代碼

項目具體代碼詳見個人 github。【由於涉及到關鍵字,項目暫時關閉了,後期開放再更新出來】ajax

4. 運行結果

由於須要展現的內容有不少,這裏只截圖展現部份內容sql

  • 以下是將通話記錄寫入到 Hbase 的表以後,生成的表以及內容;
    在這裏插入圖片描述數據庫

  • Hbase 管理界面上的calllog
    在這裏插入圖片描述截取其中一個 region 進行查看,以下:
    在這裏插入圖片描述須要注意的是,這裏的分區鍵。分區鍵的內容在我博客裏有介紹,這裏再也不贅述。後端

  • mysql 數據庫以下
    在這裏插入圖片描述

  • 前端界面展現
    程序主頁以下:
    在這裏插入圖片描述
    進入到項目主頁,以下:
    在這裏插入圖片描述
    填好參數,便可運行:
    在這裏插入圖片描述
    獲得的執行結果以下:
    在這裏插入圖片描述

5. 項目問題

在構建這個項目時,遇到了不少問題。主要有以下幾個方面:

5.1 前端方案

由於是一名大數據開發工程師,屬於後端領域,對於前端技術是的一點兒都不懂。雖然以前也曾用ASP搭建過網站,可是屬於Windows的這個技術實在不適合java。因而本身硬是學習了一遍 JSP+Servlet,雖然這些東西也不是十分友好,可是對於解決頁面展現問題仍是綽綽有餘的。在使用 JSP+Servlet 的過程當中,主要遇到的問題有:

5.2 前端頁面不會動態刷新

JSP 頁面自身沒有刷新操做。可是在Ajax中倒是能夠的。異步刷新指的就是:我在加載了一個index.jsp頁面時,即便第一次加載的時候數據尚未準備好,卻依然能夠經過ajax 將數據加載出來。可是如若經過JSPSession或者Bean方式,就不行。這裏記錄以下:
下圖是在第一次加載 telephone = 14218140347 這個用戶產生的頁面。
在這裏插入圖片描述上面這個頁面的月通話詳情是經過ajax 獲取的;而userName,province/city等字段倒是經過Bean的方式獲取;而 startMonthendMonthuserName則是經過頁面值傳遞獲取的。可是咱們能夠看到經過Bean的方式沒有將值獲取到。
接着,再次發送一次請求【刷新頁面】,以下:
在這裏插入圖片描述

在這裏插入圖片描述
接着就看到這個userName字段就獲取到了值,爲什麼手動刷新一遍就能夠獲取到值呢?緣由就如上所述:ajax 是異步刷新數據,而這裏的userName 則使用Session的方式。從而致使第一遍加載的時候沒法出現userName 字段,可是再次刷新的時候,就出現了這個字段。 那麼這個問題的解決辦法就是:在從callStatistic.jsp 時就加載這個userName,而後讓其寫入到session中,這樣在加載 statisticOne.jsp 時就能夠顯示出了userName 字段。

5.3 MapReduce 分析過程

HBase讀取數據,並將數據寫到Mysql這個過程稍有複雜,可是接觸以後就會發現其套路大體相同。這裏結合我以前的博客內容,給出以下幾個較爲基礎的實戰項目背景,結合以下幾個簡單的MapReduce程序,就能夠看懂整個分析過程。

6. 總結

  • 但願更多IT人蔘與到開源的世界中來,並貢獻本身的力量。以天下爲己任,作一名真誠,正直,優秀的科技人員。【此項目的代碼連接在:github地址
  • 有什麼問題,儘管在評論區留言,我看到以後會第一時間回覆。既然都看到這裏了,不妨點贊+關注唄 ^_^
相關文章
相關標籤/搜索