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

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

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地址
  • 有什么问题,尽管在评论区留言,我看到以后会第一时间回复。既然都看到这里了,不妨点赞+关注呗 ^_^
相关文章
相关标签/搜索