大数据项目实战二之电信大数据项目

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​​ 用于计算用户月通话时长
    大数据项目实战二之电信大数据项目_kafka_02
    它们都在​​analyze.fromHBToMys​​包下。

2.5 结果存储

将分析的结果存放在mysql中。

使用到的表主要有,(这里简单展示如下):

//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​​。【因为涉及到关键字,项目暂时关闭了,后期开放再更新出来】

4. 运行结果

因为需要展示的内容有很多,这里只截图展示部分内容



如下是将通话记录写入到 ​​Hbase​​ 的表之后,生成的表以及内容;
大数据项目实战二之电信大数据项目_mapreduce_03



​Hbase​​ 管理界面上的​​calllog​​表
大数据项目实战二之电信大数据项目_kafka_04截取其中一个 ​​region​​ 进行查看,如下:
大数据项目实战二之电信大数据项目_mapreduce_05需要注意的是,这里的分区键。分区键的内容在我博客里有介绍,这里不再赘述。



​mysql​​ 数据库如下
大数据项目实战二之电信大数据项目_加载_06



前端界面展示
程序主页如下:
大数据项目实战二之电信大数据项目_数据_07
进入到项目主页,如下:
大数据项目实战二之电信大数据项目_数据_08
填好参数,即可运行:
大数据项目实战二之电信大数据项目_kafka_09
得到的执行结果如下:
大数据项目实战二之电信大数据项目_数据_10



5. 项目问题

在构建这个项目时,遇到了很多问题。主要有如下几个方面:

5.1 前端方案

因为是一名大数据开发工程师,属于后端领域,对于前端技术是的一点儿都不懂。虽然之前也曾用ASP搭建过网站,但是属于Windows的这个技术实在不适合java。于是自己硬是学习了一遍 ​​JSP+Servlet​​​,虽然这些东西也不是十分友好,但是对于解决页面展示问题还是绰绰有余的。在使用 ​​JSP+Servlet​​ 的过程中,主要遇到的问题有:

5.2 前端页面不会动态刷新

​JSP​​ 页面自身没有刷新操作。但是在​​Ajax​​中却是可以的。异步刷新指的就是:我在加载了一个​​index.jsp​​页面时,即使第一次加载的时候数据还没有准备好,却依然可以通过​​ajax​​ 将数据加载出来。但是如若通过​​JSP​​的​​Session​​或者​​Bean​​方式,就不行。这里记录如下:

下图是在第一次加载 telephone = 14218140347 这个用户产生的页面。

大数据项目实战二之电信大数据项目_数据_11上面这个页面的月通话详情是通过​​ajax​​ 获取的;而​​userName​​,​​province/city​​等字段却是通过​​Bean​​的方式获取;而 ​​startMonth​​,​​endMonth​​,​​userName​​则是通过页面值传递获取的。但是我们可以看到通过​​Bean​​的方式没有将值获取到。

接着,再次发送一次请求【刷新页面】,如下:

大数据项目实战二之电信大数据项目_hadoop_12

大数据项目实战二之电信大数据项目_数据_13

接着就看到这个​​userName​​字段就获取到了值,为何手动刷新一遍就可以获取到值呢?原因就如上所述:ajax 是异步刷新数据,而这里的userName 则使用Session的方式。从而导致第一遍加载的时候无法出现userName 字段,但是再次刷新的时候,就出现了这个字段。 那么这个问题的解决办法就是:在从​​callStatistic.jsp​​ 时就加载这个​​userName​​,然后让其写入到session中,这样在加载 ​​statisticOne.jsp​​ 时就可以显示出了​​userName​​ 字段。

5.3 ​​MapReduce​​ 分析过程

从​​HBase​​​读取数据,并将数据写到​​Mysql​​​这个过程稍有复杂,但是接触之后就会发现其套路大致相同。这里结合我之前的博客内容,给出如下几个较为基础的实战项目背景,结合如下几个简单的​​MapReduce​​程序,就可以看懂整个分析过程。

6. 总结


  • 希望更多IT人参与到开源的世界中来,并贡献自己的力量。以天下为己任,做一名真诚,正直,优秀的科技人员。【此项目的代码链接在:​​github地址​
  • 有什么问题,尽管在评论区留言,我看到之后会第一时间回复。既然都看到这里了,不妨点赞+关注呗 ​​^_^​​。