信号强度诊断(系统架构)

设计策略

本项目前后端的设计结构,了解前端使用了哪些技术,后端使用了哪些技术

系统的设计方法是采用面向对象的设计。本系统前端页面交互主要采用B/S的结构,采用MVC及流式数据的设计思路进行规划设计。

前端数展现使用Echarts技术。与地图相关的报表使用百度地图提供的API。

后端实时数据,实时接入mysql。为了不影响线上系统的正常使用,同时能够将数据发送到大数据平台,本项目使用Canal来解析实时数据,Flume收集数据并数据发送到实时计算业务流程和离线计算两个流程中。实时数据处理流程使用Canal+Flume+Kafka+SparkStreaming等技术。离线计算使用HDFS+Hive+Azkaban等技术。

设计过程中对系统的可靠性、可扩展性以及性能进行了充分考虑和研究分析,争取通过良好的设计,在实现系统功能的前提下,最大化的提高系统性能和扩展性,减少将来的维护代价和其他成本。

 

技术选型

每个层次、每个阶段使用到了哪些软件,以及软件的版本

技术选型

组件名称

版本号

描述

表现层框架

SpringMVC

(Pivotal)

4.0.6

表现层MVC框架,易于上手,高效稳定,是使用 Servlet 和JSP技术的一种MVC实现,可帮助开发者控制WEB项目中的变化并提高专业化水平,减少开发者在运用MVC设计模式开发WEB应用的时间。

逻辑控制框架

Spring

(Pivotal)

4.0.6

提供事务管理、逻辑控制等功能,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。

持久层框架

Hibernate

(Red Hat)

4.2.12

持久层框架,对JDBC进行了非常轻量级的对象封装,使得JAVA程序员可以随心所欲的使用对象编程思维来操纵数据库。

分布式系统架构

Hadoop

 

2.7.5

Hadoop是以一种可靠、高效、可伸缩的方式对大量数据进行分布式处理的软件框架。它适用于任何规模的非结构化数据,并具有极强的容错能力。

分布式计算平台

Spark

 

2.1.0

Spark是一种粗粒度数据并行(data parallel)的计算范式,同时Spark与Hadoop可以无缝结合,并且在保证容错的前提下,用内存来承载工作集,极大地提升了运算速度。

流式处理平台

Kafka

 

1.0.0

Kafka是一个完整的系统,它提供了一个高吞吐量、高可靠性、持久性高、以及多样化的消费处理模型,可以用来解决百万级别的数据中生产者和消费者之间数据传输的问题。

实时计算开发语言

Scala

2.11

Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。

Scala 运行在Java虚拟机上,并兼容现有的Java程序。 

 

Mysql日志数据解析

Canal

 

1.0.19

canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL。

数据收集组件

Flume

1.6.0

Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。

数据库(业务+结果数据)

Mysql

5.1.73

MySQL是一个关系型数据库管理系统, 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

数据仓库

Hive

1.1

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

工作流调度

Azkaban

 

Azkaban 是一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban 定义了一种 KV 文件格式来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。

实时查询数据库

Hbase

1.2.0

HBase是一个分布式的、面向列的开源数据库。是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

实时查询引擎

Phoenix

4.14

Phoenix是构建在HBase上的一个SQL层,能让程序员用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。

模块分解策略

离线数据入库、离线数据整理、实时数据入库、实时数据计算、报表数据创建索引

离线数据入库

离线数据,大多为历史已经存在的、用于进行宏观统计分析,对于时效性不高的业务场景所使用的数据。本项目的离线分析数据均来源于此。

离线数据入库,即将数据加载到数据仓库内。首先将数据传入服务器,在大数据集群环境就绪的前提下,将数据上传到海量数据存储的HDFS 之上。

在Hive数据库中,创建数据库,创建相应的数据表(外部表),最后将HDFS上离线数据加载到数据表中。

离线数据整理

离线分析业务场景数据的整理与计算

项目中使用到的原始数据表为6张数据表。结果数据表同样为6张数据表。从原始数据表到结果数据表,需要经过业务需求的转换,表数据的加工等操作。

业务需求转换是将数据在原始数据中抽取出来,根据业务需求对数据进行处理,例如系统与版本号合并,合并成系统+版本号。单部分数据的版本号中已经存在了系统,此时是要版本号内的数据即可,不需要拼接。 例如获取数据所属的地标(数据点所属的类别),数据中含有经纬度数据,此经纬度点属于哪一类,业务需求需要提取出这些信息。最终将这这数据映射到结果表的字段中。

表数据的加工。数据经过业务处理后,需要将数据添加到结果表中。数据查询引擎Phenix直接作用在结果表之上。由于查询引擎Phenix对数据的分割是使用逗号的(“,”)。而部分数据中存在逗号,这样会破坏数据与结果表之间的关系。例如结果表有10个字段,经过业务处理后的数据字段也是10个字段,字段之间的分隔符是逗号,但数据中部分字段内部含有逗号,这样这些数据在phenix看来就不是10个字段,而是多于10个字段,在加载数据时字段和数据的对应关系就会混乱。表数据的加工主要目的就是解决这个问题。

 

最终将补充好的数据加载到结果表中。

实时数据生产及采集

实时分析业务场景数据生产与采集

项目实时数据源是mysql实时新增的数据。实时业务所需的数据来源需要编写代码实时向mysql添加数据。新数据的添加会记录到相应的日志中。Canal实时解析日志中数据的所有变化,将新增的数据解析出来,保存到本地。

Flume监控读取Canal写入本地的数据,将数据写入kafka一份,用于实时业务的计算。写入HDFS一份,用于离线数据的计算。

​​​​​​​实时数据计算

实时分析业务场景根据业务需求数据计算

实时数据写入kafka(kafka为临时的数据存储), SparkStreaming 读取kafka内的数据根据业务需求进行相应的指标计算。计算完毕后将数据写入结果数据表。

报表数据索引

对结果数据创建索引

实时的业务需求,离线的业务需求全部计算完毕后写入结果数据表(Phenix)。前端报表查询的数据来源于结果表。但由于部分需求所需的数据为明细数据(一个查询可能需要成千上万条数据)数据量较大,导致数据查询的效率很低。所以需要对结果数据创建索引,以起到加速查询的效果。

创建索引不能一个需求创建一个,这样会有大量的数据冗余,所以在创建索引之前需要对所有业务需求的SQL进行整理,尽量整理出相似的SQL。尽量创建一个索引能够解决多个需求的查询效率问题。

整理完毕后,根据整理的相似SQL 的个数,创建相应的索引。

地标 Landmark 配置

地标配置文件的配置方式和内容

项目的业务需求中需要根据数据的经纬度获取出数据所属的地标。此时需要一份经纬度点与所属地标的对应关系。此对应关系很难获取。有部分企业提供了这个对应关系,但是需要通过次数进行收费。对于企业来将此成本较大,且效益不高,不可取。

本项目采取了自维护数据的方式编写了landMark.xml,此xml内部是经纬度范围与地标的对应关。

landmark配置

系统中关于landmark配置的说明,配置文件名称为landMark.xml

配置文件格式为

<?xml version="1.0" encoding="UTF-8"?>
<!--用户请注意,经纬度提示:
<allresource> 
	<resourceitem> 
    <lowerLeftLon>左下角经度</lowerLeftLon>  
    <lowerLeftLat>左下角纬度</lowerLeftLat>
    <topRightLon>右上角经度</topRightLon>
    <topRightLat>右上角纬度</topRightLat>
    <category>一级地标(所属分类) </category>
    <landMarkName>二级地标 (地标名称)</landMarkName>
  </resourceitem>  
</allresource>
-->
<allresource> 
    <resourceitem> 
	<lowerLeftLon>116.36827</lowerLeftLon>  
    <lowerLeftLat>39.964199</lowerLeftLat>
    <topRightLon>116.37657</topRightLon>
    <topRightLat>39.971249</topRightLat>
    <category>university</category>
    <landMarkName>北京师范大学</landMarkName>
  </resourceitem>
   <resourceitem> 
    <lowerLeftLon>116.322924</lowerLeftLon>  
    <lowerLeftLat>40.004059</lowerLeftLat>
    <topRightLon>116.341752</topRightLon>
    <topRightLat>40.014891</topRightLat>
    <category>university</category>
    <landMarkName>清华大学</landMarkName>
  </resourceitem>
  <resourceitem> 
    <lowerLeftLon>116.440283</lowerLeftLon>  
    <lowerLeftLat>39.895452</lowerLeftLat>
    <topRightLon>116.441396</topRightLon>
    <topRightLat>39.895846</topRightLat>
    <category>hotel</category>
    <landMarkName>7天连锁酒店</landMarkName>
  </resourceitem>  
  <resourceitem> 
    <lowerLeftLon>116.445097</lowerLeftLon>  
    <lowerLeftLat>39.903917</lowerLeftLat>
    <topRightLon>116.445259</topRightLon>
    <topRightLat>39.904069</topRightLat>
    <category>hotel</category>
    <landMarkName>锦江之星酒店</landMarkName>
  </resourceitem>  
</allresource>

需要添加新地表时,在现有文件中按以上格式添加即可,新数据获取后,配置文件会自动生效。

浏览器兼容性

对IE8以上版本、火狐、谷歌浏览器兼容 (偶尔会有 Flash 动画需要更新)​​​​​​​

发布了177 篇原创文章 · 获赞 288 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/bbvjx1314/article/details/103676615