电信信号强度诊断项.
知识点1 项.背景
⼿机⽬前已经是⼈们⽣活必不可缺少的⼯具,给我们带来⽅便的同时,特带来⼀些困扰,例如:由于
信号强度差、⽹络速率低导致的抢红包慢,通话的质量较差。本项⽬主要⽤于分析⽤户附近的信号强
度,⽹络质量,为⽤户提供⼀些建议,例如:⽤户附近哪家运营商的⽹络质量好,信号强度⾼ ,例如,
⽤户的哪个⽅向⾃⼰使⽤的运营商信号好。
为运营商提供⼀些合理的建议,例如某⼀地理区域,某⼀地标(⾼校、居⺠区)信号强度排名。
知识点2 项.模块介绍
模块1 仪表盘:主要是领导关⼼的⼀些指标,有限展示在⾸⻚。
1、⽹络质量总数、信号覆盖总数、数据链接总数实时统计
2、上⾏、下⾏速率各个⽹络制式统计
3、⽤户分布,热⻔APP、热⻔⼿机统计等
模块2 信号覆盖: 与信号强度相关的报表。
1、信号强度分布图
2、典型地标信号强度跟踪
3、典型地标信号强度统计
模块3 ⽹络质量: 与⽹络质量相关的报表类别
1、 ⽹络质量分布
2、 ⽹络质量统计
3、 ⽹络质量排名
4、 典型地标⽹络质量跟踪
5、典型地标⽹络质量统计
模块4 数据连接:展示⽤户连接情况
1、 数据连接率分布
2、数据连接率统计
模块5 热⻔APP: 所有的与APP相关的报表业务
1、 热⻔APP流量分布
2、 热⻔APP地图
3、 热⻔APP流量排名
4、 热⻔APP流量跟踪图
5、典型地标热⻔APP流量排名
模块6 热⻔⼿机: 所有的与⼿机相关的和OS相关的报表业务
1、热⻔⼿机流量分布图
2、热⻔⼿机⽹络质量排名
3、热⻔⼿机流量排名
4、热⻔OS流量排名
5、热⻔⼿机分布图
6、⼿机OS分布图
模块7 连接点: 与数据连接相关的额所有业务
1、 连接点书排名(城市)
2、连接点地理分布
模块8 个⼈⽤户:所有的⽤户“附近”相关的业务,(以⽤户为中⼼进⾏相关的计算)
1、 ⽹络质量
2、 APP街景图
3、 OS街景图
4、信号覆盖
知识点3 后端模块介绍
模块1 后端数据导⼊:
将历史保留下来的离线数据,导⼊到⼤数据平台内。接⼊实时⽣成的最新数据,⽤于实现离线业
务。
模块2 数据存储:
⽤于存储已经⽣成的离线数据,将数据存储下来。⽤于离线分析。
将实时⽣成的最新数据进⾏临时存储(⽤于实现实时指标计算)和永久存储(做历史数据,离线数
据分析)。
模块3 数据的处理
根据离线所需的各个指标,进⾏相关的计算。
根据业务需求实时统计相关的指标,并将最新的额结果存储到结果数据库中。
模块4 :报表的⽣成
本项⽬不涉及报表开发(由前端⼯程已经开发好了),部分的数据展现过程需要带⼤家开⼀下代码
实现过程。
知识点4 数据处理流程
离线计算
1、通过命令⾏或脚本将数据上传到HDFS
2、将上传的数据加载到数据仓库内
3、根据⽬标数据的格式在数据仓库中对数据进⾏计算
4、通过⼯作流将计算后的数据进⼀步加⼯最终写⼊结果表
实时计算
5、解析开启binlog 的mysql⽇志
6、将解析后的数据写⼊本地⽬录,flume收集⽬录新增的数据
7-1、Flume将收集到的数据实时发送到消息总线,⽤于实时计算。
7-2、Flume将收集到的数据发送到HDFS,⽤于离线计算。
8、读取kafak内实时数据,实时计算相关指标。
9、将最终的指标写⼊结果数据库
知识点5 项⽬逻辑架构设计
实时上就是数据处理流程的另外⼀个纬度的解释
知识点6 原始数据(历史数据)介绍
第⼀张表:networkqualityinfo
作⽤是:⽤于⽀撑所有得与⽹路质量相关得报表(⽹络质量模块下得所有得表)
常⽤得字段:延迟(ms)、平均下载速度(kb/s)、平均上传速度(kb/s)、wifi/3G/2G、插⼊
服务器时间、(⽹络名称)
第⼆张表: app_traffic
作⽤是:⽤于⽀撑模块“热⻔APP”相关得报表。
常⽤得字段:应⽤程序名称、⽹络类型、详细类型(反推运营商)、数据成产时间、⽤户纬度、⽤
户经度、上传流量、下载流量、
第三张表 : cell_strength
作⽤是:⽤于⽀撑所有得与信号强度先关掉得业务需求⽀撑。
常⽤的字段:⽹络类型、GMS的信号强度、CDMA的信号强度、EVDO信号强度、⽤户的纬度、⽤
户的经度、信号强度收集时间
第四张表: data_connection
作⽤是:⽤于⽀撑和数据连接相关得所有得报表。
常⽤得字段:表示数据连接状态得字段,⽤户的纬度、⽤户的经度、插⼊服务器的时间
第五张表:device
作⽤是:⽤于⽀撑与设备属性相关得报表,相关得指标字段。
常⽤得字段:⼿机IMEI、⼿机品牌、⼿机型号、操作系统、操作系统版本、最后插⼊时间
第六张表:network
作⽤是:⽤于存储现在已有得⽹络得名称
常⽤得字段:⽹络ID、⽹络名称
知识点7 详细需求介绍
模块1 :⾸⻚⾯
⾸⻚⾯由实时业务和离线业务两部分组成。
模块2 :信号覆盖
⼀共有三个报表,信号强度分布图,典型地标信号强度跟踪图,典型地标信号强度统计图组成
图示
模块3 :⽹络质量
本模块共有5张报表,主要由⽹络质量分布图、⽹络质量统计图、⽹络速率排名、典型地标⽹络质
量跟踪图、典型地标⽹络质量统计图组成。
分别以⽹格图、柱状图、曲线图等形式统计不同地点的⽹络质量、各个⽹络制式的质量、以及对各
省市的⽹络质量进⾏排名等。
筛选条件有时间范围、时间粒度、典型地标、⽹络质量、⽹络制式、运营商等
图示
模块4 :数据连接
数据链接模块主要由两个报表组成,数据连接率分布图、数据连接率统计图组成。
主要以地图显示链接情况,柱状图形式展示各个⽹络制式下的链接量。
筛选条件有⽇期、运营商、⽹络制式等
图示
模块5 :热⻔APP
热⻔APP模块主要有5个报表。由热⻔App流量分布图、热⻔App地图、热⻔App流量排名、热⻔App
流量跟踪图、典型地标热⻔App流量排名组成。
展现形式为地图分布(热图)、柱状图、曲线图、饼状图等形式。
筛选条件包括时间范围、运营商、⽹络制式、APP流量、时间粒度典型地标等
图示
模块6:热⻔⼿机
热⻔⼿机模块主要有6个模块,由热⻔⼿机流量分布图、热⻔⼿机⽹络质量排名、热⻔⼿机流量排
名、⼿机OS流量排名、热⻔⼿机分布图、热⻔OS分布图等组成,
其中主要展现形式主要以地图分布、柱状图、曲线图、饼状图等形式。
筛选条件包括时间范围、运营商、⽹络制式、⼿机流量、时间粒度典型地标等
图示
模块7 连接点
连接点监控模块主要有两个报表。由连接点地理分布、连接点数排名组成。
其中主要展现形式主要以地图分布、柱状图。
查询条件为⽇期、运营商。
图示
模块8 个⼈⽤户
个⼈⽤户模块主要有四个报表,由⽹络质量、APP街景图、OS街景图、信号覆盖组成。
其中主要展现形式主要有地图分布、地图街景图。
查询条件为运营商、⽹络质量。
图示
知识点8 项.设计策略
设计⽅法使⽤⾯向对象得设计,界⾯的交互⽅式使⽤得是B/S结构。
前端使⽤的技术:柱状图,饼状图。曲线图使⽤的技术是Echarts.与地图闲逛的报表使⽤的是百度地
图提供的API.
后端使⽤的技术:实时业务使⽤的技术 canal + flume + kafka + sparkstreaming + mysql结果数据
存储 .
离线业务场景使⽤的HDFS + Hive +AZKABAN /oozie (编写⾃定义的业务逻辑)+
【hbase+phoenix】
知识点9 技术选型
表现层 SparingMVC 4.0.6(Spring)
持久层框架Hibernate 版本4.2.12
海量数据存储HADOOP 2.7.5
分布式实时计算使⽤Spark 2.1.0
消息总线 kafka 1.0.0
实时业务开发语⾔ scala 2.11
实时原始数据 mysql 5.1.73
mysql数据的解析使⽤canal 1.0.19
数据收集 Flume 1.6.0
数据仓库使⽤Hive 1.1
⼯作流调度Azkaban 或者oozie
结果数据存储: mysql (5.1.73) + [hbase 1.2+phoenix4.14]
知识点10 离线数据.库以及数据整理
离线数据库库的流程
离线数据的计算流程
知识点11 实时业务的数据.库以及数据计算
实时业务数据成产以及数据采集
实时业务数据计算
知识点12 结果数据创建索引的流程
创建索引不能.个需求创建.个,这样会有.量的数据冗余,所以在创建索引之前需要对所有业务需求的SQL进.整理,尽量整理出相似的SQL。尽量创建.个索引能够解决多个需求的查询效率问题
知识点13 地标的配置以及浏览器的兼容性
⾃⼰维护了⼀个地标与经纬度之间的关系。
左下⻆经度
左下⻆纬度
右上⻆经度
右上⻆纬度
⼀级地标(所属分类)
⼆级地标 (地标名称)
浏览器的兼容性
对IE8以上版本、⽕狐、⾕歌浏览器兼容。
知识点14 创建数据库、数据表及数据加载
创建数据库
create database Telecom;
创建数据表
create external table networkqualityinfo (id INT,ping
STRING,ave_downloadSpeed STRING,max_downloadSpeed STRING,ave_uploadSpeed
STRING,max_uploadSpeed STRING,rssi STRING,gps_lat STRING,gps_lon
STRING,location_type STRING,imei STRING,server_url STRING,ant_version
STRING,detail STRING,time_client_test STRING,time_server_insert
STRING,networkType STRING,operator_name STRING,wifi_bss_id STRING,cell_id
STRING,province STRING,city STRING,mobile_type STRING,street
STRING,location_detail STRING,upload_traffle STRING,download_traffic STRING) PARTITIONED
BY(DS STRING,DT STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY
'\t' ;
create external table app_traffic (id INT,package_name
STRING,app_name STRING,uid STRING,network_type STRING,mobile_type
STRING,cell_id STRING,wifi_bssid STRING,start_time STRING,end_time
STRING,upload_traffic STRING,download_traffic STRING,date STRING,time_index
STRING,imei STRING,sdk_version STRING,user_lat STRING,user_lon
STRING,location_type STRING) PARTITIONED
BY(DS STRING,DT STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
create external table cell_strength (id
INT,network_id STRING,network_type STRING,gsm_strength STRING,cdma_dbm
STRING,evdo_dbm STRING,gsm_bit_errorrate STRING,cdma_ecio STRING,evdo_ecio
STRING,user_lat STRING,user_lon STRING,user_location_info STRING,bs_lat
STRING,bs_lon STRING,time_index STRING,imei STRING) PARTITIONED BY(DS STRING,DT STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY
'\t' ;
create external table data_connection(id INT,imei
STRING,network_type STRING,wifi_bssid STRING,wifi_state STRING,wifi_rssi
STRING,mobile_state STRING,mobile_network_type STRING,network_id
STRING,gsm_strength STRING,cdma_dbm STRING,evdo_dbm STRING,internal_ip
STRING,web_url STRING,ping_value STRING,user_lat STRING,user_lon
STRING,user_location_info STRING,bs_lat STRING,bs_lon STRING,time_index_client
STRING,version STRING,time_server_insert STRING) PARTITIONED BY(DS STRING,DT STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY
'\t' ;
create external table device (id INT,imei STRING,company
STRING,model STRING,os STRING,os_version STRING,sdk_version STRING,cpu
STRING,total_memory STRING,free_memory STRING,display STRING,time_first
STRING,time_last STRING) PARTITIONED BY(DS STRING,DT STRING) ROW FORMAT DELIMITED
FIELDS TERMINATED BY
'\t' ;
create external table network (network_id INT,network_name
STRING) ROW FORMAT DELIMITED FIELDS
TERMINATED BY '\t' ;
数据⼊库
LOAD DATA INPATH '/HistoryDatas/networkqualityinfo_db.sql'
OVERWRITE INTO TABLE networkqualityinfo PARTITION (DS='local',DT='2017-2018');
LOAD DATA INPATH
'/HistoryDatas/app_traffic_data.sql' OVERWRITE INTO TABLE app_traffic PARTITION
(DS='local',DT='2017-2018');
LOAD DATA INPATH
'/HistoryDatas/cell_strength_data.sql' OVERWRITE INTO TABLE cell_strength
PARTITION (DS='local',DT='2017-2018');
LOAD DATA INPATH '/HistoryDatas/dataconnection.sql'
OVERWRITE INTO TABLE data_connection PARTITION (DS='local',DT='2017-2018');
LOAD DATA INPATH '/HistoryDatas/device_db.sql'
OVERWRITE INTO TABLE device PARTITION (DS='local',DT='2017-2018');
LOAD DATA INPATH '/HistoryDatas/networkid_name.sql' INTO TABLE network ;
知识点15 离线数据拆分需求及实现思路
需求:现有所有⽇期的数据都存储在⼀个⽂件内,业务需要将数据按照年⽉⽇将相同⽇期的数据整理
到⼀个⽂本中。
实现思路1:依次读取数据中的每条数据,获取数据中的⽇期字段,字段格式为“yyyy-MM-dd
HH:mm:ss”。截取出字段中的⽇期“yyyy-MM-dd”,将相同⽇期的数据存放在⼀个⽂件中,⽂件名称以
⽇期为⽂件名。
实现思路2 :利⽤mapreduce“先分后和”的思想来实现此需求
map 端操作思路:Map端获取每⼀条数据,截取出数据中的⽇期字段,根据⽇期字段再截取出其
中的⽇期。最后将⽇期作为key,将原始的⼀整⾏数据作为value,进⾏输出。
reduce端操作思路:reduce阶段获取的数据key 是⽇期,value List便是这个⽇期内的所有数据。
在reduce端每个key实现⼀个数据⽂件的创建及写⼊数据(value的list)
map开发的代码
protected void map(Object key, Text value, Context context) throws
IOException, InterruptedException {
//将数据转换成string
String linedata= value.toString().trim();
String[] linedatas= linedata.split("\\t");
//验证数据是否有第12个数据(.标是11)
if (linedatas.length>11 && linedatas[11]!=""){
// 2018-01-20 20:18:18 //获取数据中的.期字段(包含时分秒) String dateTime =linedatas[11]; //判断dateTime是否含有空格,若有则切分数据,获取.期,若没有空格,那么就跳过 if(dateTime.contains(" ")){
//获取.期字段中的.期(包含时分秒) String date=dateTime.substring(0,dateTime.indexOf(" ")); //将.期作为key 原始数据作为value进.输出 context.write(new Text(date),value);
}
}
}
reduce开发的代码
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
//对数据的有效性进.验证若key 包含“-” 表示数据有效,反之.效。
if(key.toString().contains("-")){
//1拆分.期数据 key
//年
String year =key.toString().split("-")[0];
//.
String month=key.toString().split("-")[1];
//.
String day=key.toString().split("-")[2];
//使.年..拼接路径
Path dfs =new
Path