大数据时代的到来,对数据的处理与分析有了很高的要求。本项目以通话数据去展现如何处理并分析大数据,并最终经过图表可视化展现。
本项目主要分红以下几个部分:前端
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
程序,就能够看懂整个分析过程。
^_^
。