说明书论文.doc

51实时网站流量监控分析系统【软件工程毕业论文设计说明书开题翻译PPT代码】.zip

收藏

资源目录
跳过导航链接。
51实时网站流量监控分析系统【软件工程毕业论文设计说明书开题翻译PPT代码】.zip
51实时网站流量监控分析系统【软件工程毕业论文设计说明书开题翻译PPT代码】
压缩包内文档预览:
预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图 预览图
编号:22640765    类型:共享资源    大小:658.52KB    格式:ZIP    上传时间:2019-10-23 上传人:小*** IP属地:福建
50
积分
关 键 词:
软件工程毕业论文设计说明书开题翻译PPT代码 软件工程毕业设计开题 软件工程开题 软件系统分析 毕业论文开题 软件工程毕业论文
资源描述:
51实时网站流量监控分析系统【软件工程毕业论文设计说明书开题翻译PPT代码】.zip,软件工程毕业论文设计说明书开题翻译PPT代码,软件工程毕业设计开题,软件工程开题,软件系统分析,毕业论文开题,软件工程毕业论文
内容简介:
目 录摘 要IIIAbstractIV1 绪 论11.1 背景介绍及应用前景分析11.2 国内外研究现状11.3 课题研究目标与研究内容21.4后台系统环境配置22 相关技术及工作现状介绍32.1 相关技术32.1.1 Storm32.1.2 METAQ消息中间件42.1.5 MySQL52.2 相关工作现状53 需求分析和总体设计83.1 需求分析83.1.1 应用对象83.1.2 功能需求83.1.3 非功能目标83.2 总体设计93.2.1 系统环境93.2.2 模块划分93.3 总体流程104 详细设计与系统实现114.1数据分析与建模114.2 详细设计134.3 Storm数据处理和并存储134.4数据库:用户数据存储144.5具体处理流程与逻辑设计164.5.1Spout接收METAQ消息队列164.5.2AnalysisBolt接收Spout发射的消息174.5.3AdapterBolt接收AnalysisBolt发射的消息204.5.4网站概况模块204.5.5 访客时间统计模块214.6 维度统计与指标计算224.6.1 基本指标计算224.6.2 Stream grouping 策略245 系统测试275.2 测试环境与目的285.3 测试结果与分析295.3.1网站概况模块295.3.2访问时间模块305.3.3测试总结316 结 论32参考文献34致 谢35IV基于Storm网站流量分析实现摘 要21世纪,众所周知是一个互联网信息高速发展的时代,阿里巴巴、京东等网上销售平台的成功告示着传统实体店以外的另一种销售模式的诞生-网络营销。一个企业要想在这个竞争激烈且变化迅速的市场里获得生存,必须全面了解消费者的消费需求并且时刻掌握其消费趋势,及时调整产品生产,营销计划以达到在最合理的成本下创造出最大利润的目的。本文首先介绍了基于Storm实时数据分析背景以及这个框架在大数据时代的应用前景,并粗略的介绍了本次毕业设计所使用的后台系统环境配置和每一个组件的相关起源与特征。接下来是对相关技术和领域工作现状的概述:包括METAQ消息中间件技术,Storm实时处理,数据库存储和当前流行的大数据处理技术。以此为基础,本文着重描述了基于Storm流式计算的网站流量分析从数据建模到系统实现的相关技术和细节,其中包括:Storm集群中组件和工作流程,各个维度的意义和分析,指标计算的逻辑和实现,METAQ中间件的消息处理,topology的构建,Spout接收数据、Bolt实现数据的接收、逻辑计算处理和发送存储,用户数据的存储(MySQL开源、关系型数据库)等,最后介绍了关于本系统完成编码后的测试方法以及测试环境配置和测试结果分析。关键词:Storm;METAQ;维度;指标;数据库CAPTCHA Design Based on Bootstrap websiteAbstractIn the 21st century, with internet information developing so fast, great sucess of online sales plateform like Alibaba, Jingdong online sales platform raises that besides traditional store,another sales type appears,which represents the birth of the network marketing. In todays market,by the increasingly fierce competition,An enterprise want to survive must have a comprehensive solution to the consumers needs, always grasp the consumers shopping trends and timely adjust the plan of producing production and marketing plan to create maximum profits at the most reasonable cost.Firstly, this paper introduces the background and significance based on storm real-time data analysis,a rough description of the graduation design used by the back-end system configuration and the origin and features of each component. Next is related to technology, then an overview of the status of work in the field: including METAQ message oriented middleware technology, real-time storm processing, database storage and the current popular data processing technology. Based on this, this paper focuses on the description of the related technologies and details based on storm flow calculation of site traffic analysis,including the process from the modeling data to the system realization.For example: significance and analysis of various dimensions,indicators calculation logic and implementation,METAQ middleware message, the way to construct topology ,the process of how spout and bolt receive, process and send data, the way to store user data (using MySQL database), and finally this paper introduces test and analysis for this system.Keywords: Storm;METAQ;dimension;index;database1 绪 论1.1 背景介绍及应用前景分析本世纪是一个互联网信息高速发展且日渐成熟的时代,阿里巴巴、京东等网上销售平台的成功告示着传统实体店以外的另一种销售模式的诞生-网络营销。在这样一个弱肉强食,存在激烈竞争的市场里,一个企业想要获得生存,必须全面了解消费者的消费需求并且时刻掌握其消费趋势,及时调整产品生产,营销计划以达到在最合理的成本下创造出最大利润的目的。大数据的到来完美解决了这一需求,企业通过建立门户网站宣传销售产品,在用户访问之后获取流量信息从而进行判断用户行为并进一步对之分析,为后续制定最佳宣传和销售方案做好最优质的准备。本课题研究的网站流量分析与监控无疑是代表着高效率和高性能,让企业充分认识到数据的价值与作用。换一个角度来看,现今企业与企业之间的竞争已经演变成数据的竞争,服务器和数据库的完美结合扮演着工业时代中厂房,流水线作业的角色。不难看出,对于一个想要与时俱进的企业,当务之急无疑是重视数据资源的搜集,提高数据质量,进行数据挖掘,分享和进一步利用。本课题研究开发的网站流量分析,是指用web前端相关技术抓取用户基本数据资源生成原始文件,通过数据分析,使用相关软件建立简单直观的数据模型,确定相关指标,维度,对文件进行预处理,统计将原始文件根据相关指标,维度进一步规范化,从而探究出用户对网站访问的规律,网站管理员再从发现的规律中总结分析用户行为和消费意向,为企业进一步制定产品生产,宣传,销售计划提供最为直观可靠的依据。本网站流量分析的原始数据是通过实时抓取分析的,代表着最新的用户数据,其准确性和价值远远高于传统数据采集。传统的企业经营策略多基于专业的财务分析报告,而网站流量分析对企业营销的作用似乎不仅仅如此,它是通过精确的数据分析,基于相关指标得出的最新数据,充分发挥数据的效用。人的思维往往不可避免的发生错误,冗长的数据统计更加是给传统的计量带来许多未知的失误,难以及时发现漏洞,甚至有时会使企业错失最佳更改计划的时间从而蒙受巨大的损失。流量分析通过专业的数据分析师,网络运维人员实时监控数据质量,将大数据时代的特性发挥的淋漓尽致。1.2 国内外研究现状现阶段,各类数据额收集和处理分析的价值日益在大数据行业显示出来,然而对于庞大的数据量以及业务对时效性的要求,传统数据库的存储和计算能力都远远不能达到所需要求。以Apache,Cloudera为首的公司提出安全且高效的Hadoop生态圈的概念。目前,在Hadoop社区,关于数据处理的主要有基于Mapreduce模型计算,适合离线批处理的Hadoop,类似于Hadoop的计算模型但以RDD为弹缓冲,适合时效性较高的流式处理的Spark,还有时效性最高,官方提出响应时间快达0.1秒的Storm。一方面为提高企业市场竞争力,一方面面对提出高时效性的需求,国内外互联网公司将视线转向大数据平台的开发处理。截至2016年的现在,国内以阿里,华为为代表的云平台环境也成为类似于太平洋保险等不对Hadoop环境具有运维能力的国企的重要数据处理的选择。但是由于Hadoop的开源特性,处理效率与数据安全性之间的矛盾很大程度上成为国有企业对之青睐的绊脚石。1.3 课题研究目标与研究内容本次课设以Storm为主要开发工具,但在设计初期,我们需要对Hadoop生态圈的相关组件有较为全面的认知并对各项技术之间的优劣进行比较,以确保选择的Storm是对本次业务场景下的最佳技术选型。首先,由于硬件设施的缺乏,本次课设的所有前期准备都是基于虚拟机或者是三台机器搭建的简单集群的测试技术验证。上文对于国内外的技术选型已有阐述,即是Hadoop,Spark,Storm,下面着重对这三种技术的适用场景进行论述。首先,作为大数据处理平台最为基础且关键的技术框架,Hadoop是基于MapReduce计算模型对数据进行复杂处理的,对于千万级数据或亿万级数据的批量处理效率是Oracle,MySQL等传统的关系型数据库无法匹敌的。MapReduce的计算过程是将Map产生的中间结果批量写入磁盘,通过Shuffle过程,Reduce程序会从磁盘取出数据进行计算并产生中间结果,磁盘的读取降低了对系统内存的要求,但同时读取速度也促使Hadoop数据处理产生延迟,本次课题是对网站流量进行监控分析,需要实时数据处理,所以Hadoop以及以MapReduce为计算引擎的Hive都不能满足需求。类似于Storm,Spark对数据的处理也提出了“流”的概念。Spark是基于Scala开发的,目前主流支持的API主要是Java,Python和Scala,解除了Spark Shell后,会发现Spark较之于Storm更加趋向于“功能性”的开发,开发者需要对其中常用的API熟悉调用。要在短时间内对于Spark的原生方法有比较全面的了解且达到熟练使用,这个要求既不是这次毕设的主要目的,也不适用于课题研究。Storm 同是流式数据处理,Storm与Spark除了不需要依赖Hadoop Yarn集群,对于本次课设的技术选型还有一个决定性的优势:主要是通过开发者创建的类和接口来实现相关功能需求。至此,不难得出结论,对于此次网站流量监控,综合时效性,技术研究成效性,使用成本的多重考虑,Storm无疑是最佳技术选型。1.4 后台系统环境配置本系统是使用Storm集群在Linux操作系统下对数据进行实时处理,并将处理完的结果数据插入到MySQL数据库中,其中Storm部分的功能是由Java编写实现。22 相关技术及工作现状介绍2.1 相关技术2.1.1 Storm本系统后台核心技术是Storm集群上的数据处理。区别于相关传统数据处理,Storm是在大数据领域中的一套可靠的,廉价的,可容错的,分布式的用于处理流式数据的系统框架。Storm架构中的节点种类大体可以分为主节点和工作节点。在主节点上,运行着一个守护进程,负责在Storm集群里分发代码并在为每一个工作节点任务调度的同时监控任务的失败与否状况,即Nimbus。在工作节点上则运行着Supervisor,负责接受并监听nimbus分配的任务,根据需求启动或停在自己管理范围内的相应任务进程。另外,主从节点之间由Zookeeper连接协调,完美地保证了系统的可靠性,减少数据丢失的可能性。接下来,是对Storm中相关组件的介绍。 topologyTopology是一个随同Storm运行周期实时运行的应用程序,Storm的消息处理首先就是创建Topology,合理的使用消息流分组机制将spouts和bolts连接起来。当一个拓扑程序被启动后,除非程序员手动将其关闭停止,不然会一直运行,即使是集群中机器意外损坏,Storm也可以将对应机器上的所有任务转义到其他有效机器上并冲洗分配失败的任务。基于Nimbus是Thrift服务的原因,Topology也是一个Thrift结构,这就代表着用户在使用时可以提交由任何语言创建的topology。 SpoutSpout是topology里面的消息源,即是一个拓扑结构里的消息生产者。大多数情境下,Spout会从一个消息中间件收到程序需要处理的消息,之后向监控程序发出消息以tuple的形式发送。在消息的接收和发射过程中,最为核心的方法就是nextTuple()方法。这个方法会执行将所接受到的消息发射到拓扑程序中去,在没有新的消息的情况下会进行相应的默认返回。但由于Storm在是在同一个线程上调用所有Spout方法的,开发者必须注意此方法不能够阻塞。Spout类里面还有是ack()方法、fail()方法。zookeeper发现一个拓扑程序处理完成一个消息单元的时候就会自动调用ack()方法,如果执行失败就会相应的去调用fail()方法。值得一提的是,Storm里Spout可靠性如今仍然是需要按情况划分。可靠的Spout在tuple处理失败的情况下,会重新发射一个tuple,而不可靠的则是直接忽略。拓扑程序只有在整体可靠的情况下才会调用成功或失败函数返回相应参数。开发者可以使用定义输出域类里面的declareStream来定义不同的数据流,并通过Spout输出集合类发射指定的消息流,这也使得消息源可以同时发射多条不同的消息流。 BoltBolt是一个是拓扑程序中接收消息数据之后进行具体逻辑计算、数据处理的重要组成部分。与的论述类似,我需要介绍Bolt类中比较重要的一个函数-execute()。它接收上层Bolt或者是Spout发射的一个tuple作为输入,再调用OutputConllector来发射处理好的tuple,不同于Spout的是,Bolt必须在处理每一个tuple后调用ack()方法,以便转达整个拓扑程序这个消息流已经被处理完成且成功返回相应数据,从而使得这个流的发射者获取处理成功消息。其中,IBasicBolt类会在程序运行过程中自动调用ack。从上文的介绍不难看出,Bolt可以进行一般的Stream的传递,也可以对消息流进行复杂的逻辑处理。在复杂处理的情况下,一般都需要多个步骤才能完成,也就是需要建立多个Bolt达成最终处理效果。例如最简单的WordCount操作,其中就需要先对文件中的单词拆分再进行相关计数。这就要求建立最少两个Bolt。另外,Bolt和Spout类似的是,也可以发射多个消息流,同样使用OutputFieldsDeclarer的declareStream来定义Stream,再根据需求选择指定的Stream。 TupleTuple是一个拓扑程序里面进行传递的一个基本消息单元,对于开发者,只需要按指定的顺序加入相应的值,所以换一个角度,tuple也是一个值的数组。 Stream顾名思义,Stream就是简单的消息流。在Storm中,它是一个关键抽象,一个消息流是一个没有边界的,它可以以横向扩展的方式并行创建、处理的消息序列。tuple的定义我们可以通过命名Stream中tuple序列序列中的每一个字段。在默认的情况下,tuple的字段类型可分为:整型,长整型,short型,字符型,double型,布尔型,字节数组型和float型。每一个消息流被定义后会被分配一个id,大对数情况下,我们不需要可以去指定一个id,输出域类中的相关方法在定义一个消息流的同时,会对其分配一个默认值default id。2.1.2 METAQ消息中间件MetaQ是一个阿里巴巴受Apache kafka的思想启发实现的一个开源的分布式的消息中间件。它由纯Java开发,虽然思路起源是Kafka,但又不是对Kafka的一个简单复制。所有消息中间件能够完成的的任务它都能实现,极大程度地保证了分布式系统的可扩展性和可伸缩性。MetaQ具有高可用性,消息存储顺序写、高吞吐量、支持本地和适用于大规模的分布式系统应用等特性,目前在大数据处理领域有很大的发展空间,例如目前淘宝和支付宝对其就有着广泛的应用。2.1.3 MySQL有关MySQL的介绍,前文已有详细介绍,这里就不加论述。2.2 相关工作现状过去二、三十年里,大部分企业的数据库都会去选择关系型数据库,而对数据的查询则是数据库管理系统,然而随着大数据时代的到来,我们需要进行抓取,转换,存储的数据量以救人的速度增长,仅仅从2010年以来,世界范围内数据量的存储就以每年50%的增长率甚至更多的比例上升。用户的需求与信息越来越不趋向于一致,加上数据量的几句增长,数据分析服务就必须加实时性,传统的数据处理系统无论是对于成本的考虑,还是对于处理效率的考虑,都已经不能满足。于是,便出现了以Hadoop为代表的适合于大数据处理的分布式计算系统,但由于Hadoop是多次读取一次写入的批处理特性,当需求实时性数据的情景下,变诞生出多次读取多次写入的Storm,使得用户的每一次点击与评论多能即使反馈给电商,以这样的形式将不一样种类的data灵活地组织在一起,再通过相互关联和互动,衍生出大于数据本身对于当今时代的价值。在日常网页浏览时,几乎所有用户对下文文所展示的情景都不陌生,大数据平台已经通过方方面面渗透入我们的生活:在搜索引擎中搜索相关内容后,接下来的浏览页面会出现一部分与搜索内容相关的广告信息与推广,这就是Storm流式处理在广告平台上的应用与发展;对于电商分析行业,用户从进入网站开始的每一次搜索、点击、购买等行为都会快速的归入个人模型信息中,然后立刻分析反馈出页面上的商品推荐;对于微博,Twitter等社交平台而言,用户的位置和发言等个性化行为发生改变后,也能很快的反映在页面上对他的好友推荐和相关话题提醒上,对于产品的推广和店铺的宣传等方面产生出极大的效益。另外,在交通管理方面也体现出Storm实时性的优点,如一个超速报警系统中,我们会通过监控分析路面的来往车辆的data,在所监控的路段的车辆数据超过系统设置的阈值时,便会将相关车辆和违规data存入到MySQL。对于实时查看违规情况的交警同志而言,Storm的实时特性别显现出来,任何一辆触犯交通法规的汽车都能够被及时捕捉到且在最早时间内被通知到,减少因为时间延迟而导致的拖延与工作积压。各个平台应用示例如下图所示:图2.1 广告平台推送图2.2 社交平台推送图2.3 购物平台推送综上所述,采用Storm技术的互联网公司越来越多,设法实时流量监控的需求也越来越多,对流量监控提出了更高的要求。目前,为了更加精确流量监控的结果分析,阿里淘宝推出更为完善的量子恒道等大数据电商分析平台,从不同维度,不同指标进行对流量监控,如图2.4所示。该流量监控是从站点视角出发,对不同站点的浏览量,访客数,跳出数,转化页数等进行统计,形象直观的反应了用户对网站的访问情况。图2.4 电商流量分析在我国,淘宝、腾讯、京东和百度都拥有具有自身企业用户特色的大数据源。考虑到数据经常会达到TB级别,实时处理成为了许多企业需要面对的一个发展瓶颈。于是就出现了一个可扩展,有效的开源实时计算工具-Storm,有效的填补了hadoop在实时计算方面的缺陷。但是Storm相较于Hadoop要简单许多,追求实时性数据的需求使得流式数据处理越来越因为实时性的特征收到互联网公司的欢迎。353 需求分析和总体设计3.1 需求分析3.1.1 应用对象本系统的应用对象是希望实时了解用户对企业网站的访问情况并加以改变营销推广策略的电商系统管理员。3.1.2 功能需求1、Spout接收前台抓取到的数据并存放到METAQ消息队列中,再以tuple的形式发射到第一个处理Bolt中,由第一个Bolt消息转化为LogMessage对象,在发射给第二个Bolt过滤掉购物车消息。2、接收第二个Bolt发射出的消息流,分别从网站概况,实时访客,地域分布,系统环境,访客停留时间统计,受访页面六个方面统计网站用户行为。从站点,系统环境,访客时间,地域,访次等维度计算访客数(uv),访问量(pv),停留时长(visit_duration),ip数,访次数(visit_num),跳出数(bounce_num)等指标插入mysql数据库中的相关表中,web前端再从数据库中抓取数据展示到前台页面。两大模块的功能需求如下:网站概况:(1)网站概况界面展示的是不同站点下根据流量来源(上游访问URL)所产生的浏览量,访客数,IP数,跳出数,访问时长以及各个指标在总流量的占比情况,使得用户比较明了的了解各个网站页面对于游客吸引力的大小。(2)网站概况页面通过折线图的方式展示每一个指标在24小时内,最近一周,最近一个月内的发展趋势,便于站点管理人员及时调节各个网站的页面以及为后续网站宣传活动选出最具商业价值的页面链接。实时访客:(1)实时访客模块即是对访客时间统计模块,页面呈现给用户的是在指定时间内用户选择的相关指标的一个变化趋势,网站管理员通过查询这一页面模块,可以实时掌握流量走向并且在出现异常的情况下即是发现,便于网站的管理和经营模式的分析对比。(2)通过Echart展示方式突出用户选择的指标在24小时内,用户可以可点击选择不同的时间段(今天、几点),页面下方即展示不同时段的数据。选择一个时间段时,折线图显示的是每天的趋势情况。即筛选不同的指标,下方即可展示指标的趋势变化,满足用户对全量数据的了解需求。3.1.3 非功能目标本系统性能目标如下:1、 在接受到消息的时候,响应和处理速度要快。2、 能够接收大数据处理,数据吞吐量相较于传统系统要有显著上升。3、 减少数据丢失的风险。4、 系统稳定性较好。3.2 总体设计3.2.1 系统环境本系统Storm的开发运行环境是Linux mint 17.3,开发所使用的软件是JDK1.6、Eclipse、Maven这3款软件。另外本系统运用的是Storm的本地开卡调试模式。经过测试运行,本系统可以适用于大多数Linux发行版本。3.2.2 模块划分本系统设计分为如图3.1中所示的六个模块:网站概况,实时访客,地域分布,系统环境,访客时间统计,受访页面。图3.1 模块划分图整个系统从功能上划分主要有3大部分,以数据流动处理过程可分为前期根据需求对目标网站抓取信息,接收抓取到的信息处理分析得出结果并进行存储和以简单直观的页面形式向用户展示,即专业术语的爬虫抓取,后台数据处理,前端数据展示,三者之间的结构以及数据流向如下图所示: 3.2 系统结构图因为是小组团队开发,我的工作主要集中于对数据预处理和对消息源的发送处理以及具体两个功能模块的开发,下面我就自己设计到的两个功能模块进行阐述。网站概况模块提供目标网站运营状况的整体情况,主要包括各个时间维度相关指标的趋势、访问来源、页面排名、访客地域等宏观数据。帮助系统管理员对网站有一个概括性数据的了解。用户进入页面后,可依据用户自身的权限,选择不同的url,选择相应的url之后,页面下方显示的即为相应网站的数据。用户可以点击不同的时间以实现时间切换,即可显示不同时间的指标数据。选择某一天时,折线图显示的每个小时的趋势。选择一个时间段时,折线图显示的是每天的趋势情况。访客时间统计模块主要是查看在相应时间段内网站访客的访问行为所产生的流量各指标的数据统计情况,时间以具体的“日、小时”(如:2016年03月12号、2016年03月12号02时)作为划分统计。用户可以可点击选择不同的时间段(今天、几点),页面下方即展示不同时段的数据。筛选不同的指标,下方即可展示指标的趋势变化。择某一天时,折线图显示的24小时中的趋势。选择一个时间点时,显示的是每小时的数据情况。3.3 总体流程设置目标网站并获取各网站需监控网页的URL,通过爬虫技术抓取相应指标相关的信息数据,如:url,pc或移动设备信息,用户点击或输入行为等,这部分数据以消息流的形式发送到消息中间件MetaQ服务器,由MetaQ作为传输channel将数据发送到Storm的接收消息部分:Spout(根据topic接收)。1.Storm服务器根据配置,由Spout接收MetaQ发送的消息,再转发给各个bolt(具体的统计单元),spout做的事情主要有:(1)初始化,加载资源。(2)open方法,只执行一次,主要是加载一些资源,启动metaQ的监听器,接收从MetaQ发过来的消息。(3)nextTuple方法,循环调用,一毫秒取一条消息,向后续bolt发送前,同时每隔30秒发送一次更新数据库消息,同时限制1秒内,发送的消息不大于1000条。(4)close()等在关闭时调用,释放资源。2.Spout接收到数据不对其进行任何处理直接向下游第一个Bolt发出,即AnalysisBolt。后续所有的bolt均由AnalysisBolt处发出,此处bolt接收spout发出的消息,并做处理,具体如下:1.prepare方法1)初始化数据库连接,初始化redis连接。2)读取数据库相关配置信息,调用Refresh()方法 ,Refresh()方法在后面每隔5分钟会重新调动刷新。2.循环执行execute方法,做过滤并向后面发消息,具体:1) 校验,消息为空或者type=4返回。2)20秒内重复发更新数据库消息,则直接返回。3)设置消息对象的月份属性。4)用消息的siteid和内存中的站点信息比较,不存在则返回。5)重新拼接sessionid,用原sessionid+siteid为新的sessionid。6)getUniqueid为空直接返回,否则设置新老用户标志。4 详细设计与系统实现4.1 数据分析与建模在需求分析初期,我们不需要对具体技术和运行环境有完整的了解,数据建模的意义在于在于是开发人员对所需要处理的数据和相关模块之间的关系以及对配置表的使用有一个较为系统的认知。在本系统刚开始实现阶段,我们小组成员经过几次的讨论与研究,将所有需要使用的配置表和相关模块的表字段统一出来,具体如下图所示:图4.1 数据建模图4.2 详细设计本毕设的详细设计如图4.2所示,具体设计与实现将在下文逐一论述。图4.2详细设计流程图如图4.2所示,MetaQ,AnalysiBolt,AdapterBolt主要负责消息流的就收传输,六个模块相应Bolt完成具体功能模块的指标计算与存储。4.3 Storm数据处理和并存储Storm主要进行的是对数据源的处理与发送,并通过相关Bolts的具体计算获取最终要求的指标,而所有的Spout,Bolt流程操作则有Topology的建立决定。有关详细的数据接收到发射,数据预处理阶段,各维度计算逻辑以及存储到数据库的过程会在下文具体处理流程与逻辑设计描述。4.4 数据库:用户数据存储本系统的数据库采用的是MySQL关系型数据库,每个功能模块的最终计算结果都是存放到数据库里面的。具体表结构如下图所示。visitor_time表,存放的是访问时间模块(小时)的相关指标,具体内容如图4.3所示。图4.3 visitor_time表visitor_time_day表,存放的是访问时间模块(天)的相关指标,具体内容如图4.4所示。图4.4 visitor_time_day表reach_page表存放的是网站概况模块(天)的相关指标, 具体内容如图4.5所示。图4.5 reach_page表reach_page_hour表存放的是网站概况模块(小时)的相关指标,具体内容如图4.6所示。图4.7 reach_page_hour表Storm支持使用MySQL关系数据库数据库,并且为用户提供了一套较为简单的接口。本系统需要现在配置文件中先对数据库名和用户名、密码进行定义: 08 3306 mytest /数据库名称 root/用户名 root_/密码 utf-8 对于数据库的连接,SQL语句的执行和数据库的关闭操作,本系统中定义了一个MysqlDB类。在具体应用时,我们只需要实例化一个MysqlDB对象,调用相关执行SQL语句函数即可。具体插入目标表中的代码如下所示:SqlBuilder sqlBuilder = new SqlBuilder(INSERT INTO visitor_time(date_time,url,pv,uv,us,ip,v_out,v_time)+ VALUES(?,?,?,?,?,?,?,?);sqlBuilder.setString(1, DateUtils.formatTo(key.getStartTime();sqlBuilder.setString(2, key.getsubUrl();sqlBuilder.setInt(3, value.getPv();sqlBuilder.setInt(4, value.getUv();sqlBuilder.setInt(5, value.getUs();sqlBuilder.setInt(6, value.getIp();sqlBuilder.setInt(7, value.getFirstSightLeave();sqlBuilder.setInt(8, DateUtils.msToS(value.getTotalStayMs();sqlString = sqlBuilder.getQueryString();/获取执行语句和所有需要插入的值int rowId = mysqlDB.execInsertSql(log, sqlString);/执行SQL语句4.5 具体处理流程与逻辑设计4.5.1 Spout接收METAQ消息队列Storm服务器根据配置,由Spout接收METAQ消息中间件发送的消息,再转发给各个Bolt(具体的实现统计模块),本系统Spout做的事情主要是:1、初始化,加载资源,读取配置文件。2、open方法,只执行一次,主要是加载一些资源,启动METAQ的监听器,并接收METAQ发过来的消息队列。当一个Task被初始化的时候会调用此open方法。在此方法中初始化发送Tuple的对象collector、配置对象context,相关代码如下:public void open(final Map conf, final TopologyContext context, final SpoutOutputCollector collector) String topic = (String) conf.get(TOPIC);log.error(metaClientConfig.getZkRoot() + consumerConfig.getGroup() + scheme);if (topic = null) throw new IllegalArgumentException(TOPIC + is null);Integer maxSize = (Long) (conf.get(FETCH_MAX_SIZE).intValue();if (maxSize = null) log.warn(Using default FETCH_MAX_SIZE);maxSize = DEFAULT_MAX_SIZE;this.id2wrapperMap = new ConcurrentHashMap();this.messageQueue = new LinkedTransferQueue();try this.collector = collector;this.setUpMeta(topic, maxSize);log.debug(opened!); catch (final MetaClientException e) log.error(Setup meta consumer failed, e);3、nextTuple(),循环调用,10秒钟去一次消息,想后续bolt发送tuple之前,同时每个30秒的时间更新一次数据库,并限制1秒内,发送的消息不能大于1000条。部分代码:public void nextTuple()final Message message = wrapper.message;/获取消息源this.collector.emit(this.scheme.deserialize(message.getData();this.id2wrapperMap.remove(message.getId();/删除缓存中的消息idwrapper.success = true;wrapper.latch.countDown();checkMsgLimits();/限制1秒内,发送的消息不能大于1000条private void checkMsgLimits() long ct = System.currentTimeMillis();if (ct / 1000 != currSecs) currSecs = ct / 1000;msgCountCurrSec = 0; else msgCountCurrSec+;if (msgCountCurrSec = msgUpLimitPerSec) try Thread.sleep(currSecs + 1) * 1000 - ct); catch (InterruptedException e) log.error(, e);4、close()方法是在关闭时被调用,释放所有资源。4.5.2 AnalysisBolt接收Spout发射的消息后续所有的Bolt均由此发出,AnalysisBolt解说Spout发出的消息,并做处理,具体如下:1、prepare方法:1)初始化数据库连接,初始化redis连接2)读取数据库相关配置信息,缓存到内存中,调用Refresh()方法,且该方法每个5分钟会重新被调用刷新。private void Refresh() if (lTime = System.currentTimeMillis() - 1000 * 60 * 5) / 5分钟取一次return;lTime = System.currentTimeMillis();try mapSite.clear();ResultSet rest = mysqlDB.GetStatement().executeQuery(select * from site);while (rest.next() String url = rest.getString(suburl).toLowerCase();int id = rest.getInt(id);String urlArray = url.split(;);for (String str : urlArray) mapSite.put(str, id);LOG.debug(str);rest.close();sourceTypes = loadSourceTypes(mysqlDB); catch (Exception e) LOG.error(msg = + e.getMessage() + n, e);2、循环执行execute方法,对消息进行过滤并向后续Bolt发射消息,具体:1)校验:消息为空或者type=5时,直接返回不往下操作。2)20秒内重复发更新数据库消息,则直接返回。3)设置消息对象的时间属性。代码如下:public void execute(Tuple input, BasicOutputCollector collector) try long st = System.currentTimeMillis();LOG.debug( BEGIN END );LOG.debug(StringUtils.genTimeLog(et - st); catch (Exception e) LOG.error(, e);在AnalysisBolt里面还有一个重要的对消息的预处理,就是按行拆分消息并将之将消息字符串解析为LogMessage类变量/* * 将消息字符串解析为LogMessage类变量. * param logString 消息字符串 * return LogMessage对象存放解析出的信息 */public static LogMessage AnalysisString(String logString,String sepChar) if(logString = null)return null;String nameStrings = splitLog(logString,sepChar);if (nameStrings.length = 0) return null;/对消息进行回收LogMessage message = new LogMessage();for (int i = 0; i nameStrings.length; i+) String string = nameStringsi;String strings = splitNode(string); /根据不同的分隔符对字符串拆分if(strings = null)continue;/如果为空,则跳出/不为空就肯定有2个数据setValue(message,strings0,strings1);return message;4.5.3 AdapterBolt接收AnalysisBolt发射的消息设置消息所属区域信息,包括省份id,省份名称,城市。核心处理代码如下所示:if (logmsg != null) log.error(logmsg:+logmsg);/更新数据库消息if(logmsg.getType() = LogMessage.TYPE_UPDATEDB)collector.emit(new Values(logmsg);return;if(logmsg.getType() = LogMessage.TYPE_SHOPPING)/不处理return;/地域AreaLoader.getAreaLoader().setArea(logmsg, mysqlDB, log);4.5.4 网站概况模块网站概况部分的消息源来自AdapterBolt,实现代码在Topology的grouping,此项目中我们用的方式是shuffleGrouping:topologyBuilder.setBolt(AllPageHourBolt.NAME,newAllPageHourBolt(),1).shuffleGrouping(AdapterBolt.NAME);网站概况部分的维度分别是url,url_name和时间,由于分时间段,我将之分为两个子模块(天,小时):protected List enumerateKeys(LogMessage logMsg) /设置维度List keys = AllPageKey.enumerate(logMsg.getUrl(),logMsg.getTitle(),new Date(logMsg.getRefreshTime();System.out.println(时间格式:RefreshTime+logMsg.getRefreshTime();return keys; 设置好维度后,程序会调用数据库更新操作并执行相关插入互更新操作。4.5.5 访客时间统计模块访客时间统计模块的计算维度是url,时间,代码如下所示:Override/覆盖写key值protected List enumerateKeys(LogMessage logMsg) List keys = VisitTimeKey.enumerate(logMsg.getUrl(),new Date(logMsg.getRefreshTime();return keys;检查数据库更新,从数据库中取出数值并判断是否需要更新数据。代码如下:static Map loadValues(MysqlDB mysqlDB, Date time) Map map = new HashMap();try SqlBuilder sqlBuilder = new SqlBuilder(select id,date_time,url,pv,uv,us,ip,v_out,v_time from visitor_time where date_time=?);sqlBuilder.setTimestamp(1, new Timestamp(DateUtils.trimMinutes(time).getTime();String sql = sqlBuilder.getQueryString();ResultSet rs = mysqlDB.GetStatement().executeQuery(sql);while (rs.next()String subUrl=rs.getString(url);Date startTime = rs.getTimestamp(date_time);VisitTimeKey key = new VisitTimeKey(subUrl, startTime);StatValue value = new StatValue();value.setPv(rs.getInt(pv);value.setUv(rs.getInt(uv);value.setUs(rs.getInt(us);value.setIp(rs.getInt(ip);value.setFirstSightLeave(rs.getInt(v_out);value.setTotalStayMs(rs.getInt(v_time)*1000L);value.setNeedDbInsert(false);value.setRowId(rs.getInt(id);value.setUpdated(false);map.put(key, value); catch (SQLException e) log.error(,e);return map;4.6 维度统计与指标计算本系统分为:网站概况,实时访客,地域分布,系统环境,访客时间统计,受访页面六个模块,计算时根据不同维度对应不同的Key值,得到不同的Value值,即指标结果。4.6.1 基本指标计算1)浏览量(PV)监控页面的访问量,PV,用户每打开或刷新一次页面PV数+1。public void calcPv(StatValue value, LogMessage logmsg) / pvvalue.setPv(value.getPv() + 1);2)访客数(UV)指拥有不同userid的访客访问数,一台PC或移动终端视为一个访客。(频道的访客数:若一个用户访问了两个频道,计算频道的访客数时,则两个频道的访客数均加1)public void calcUv(StatValue value, LogMessage logmsg) / uvif (!getUserIds().contains(logmsg.getUniqueid() value.setUv(value.getUv() + 1);getUserIds().add(logmsg.getUniqueid();3)跳出数只浏览了一个页面便离开了网站的访问次数。/ 如果之前有访问次数,用前面的平均算作跳出页的时长加入到总时长if (visiTimes 0) value.setTotalStayMs(value.getTotalStayMs() + sessionInfo.visitTimeLength / visiTimes);/ 如果之前没有访问次数,写死2分钟算作跳出页的时长加入到总时长 else value.setTotalStayMs(value.getTotalStayMs() + TimeConstants.DEFAULT_ADDED_SECS * 1000L);value.setUpdated(true);reCalMap.put(key, value);break;4)访问停留时长访客浏览某一页面时所花费的总时长,计算公式为:页面的停留时长=进入下一个页面的时间-进入本页面时的时间。public void updateTotalStaySec(String sessionId, long refreshTime, StatValue value) value.getSessionIdInfos().put(sessionId, sessionId + * + refreshTime);if (refreshTime = 0) log.warn(refreshTime = 0 while LocalDailyCacheValue.updateTotalStaySec.);return;if (!sessionFirstVisitTime.containsKey(sessionId) sessionFirstVisitTime.put(sessionId, refreshTime);long totalMs = value.getTotalStayMs();SessionInfo sessionInfo = null;/ addedif (sessionLastVisitTime.containsKey(sessionId) log.debug(refreshTime: + refreshTime + ,lastVistTime: + sessionLastVisitTime.get(sessionId);totalMs += (refreshTime - sessionLastVisitTime.get(sessionId);/ beginaddedsessionInfo = sessionVisitInfo.get(sessionId);sessionInfo.visiTimes = sessionInfo.visiTimes + 1;sessionInfo.visitTimeLength = sessionInfo.visitTimeLength + (refreshTime - sessionLastVisitTime.get(sessionId);sessionInfo.refreshTime = refreshTime; else sessionInfo = new SessionInfo();sessionInfo.refreshTime = refreshTime;/ addedsessionVisitInfo.put(sessionId, sessionInfo);/ addedvalue.setTotalStayMs(totalMs);sessionLastVisitTime.put(sessionId, refreshTime);5)入口页次数:指在一次访问行为中,该页面作为入口页面的次数public void calcEntry_page_times(StatValue value, LogMessage logmsg)/ entry_timesif (logmsg.getType() = LogMessage.TYPE_ENTER) value.setEntry_times(value.getEntry_times() + 1);6)退出页:指访问过程中最后一个浏览的网站页面,访客关闭页面后浏览器不再有本网站的页面。(浏览器作为tab标签形式打开网站的多个页面,然后访客直接关闭浏览器后,最后一个打开的页面即为退出页)。7)退出页次数:某页面作为访问会话最后一个浏览页面(即退出页)的次数。public void calcLeave_times(StatValue value, LogMessage logmsg)/ leave_timesif (logmsg.getType() = LogMessage.TYPE_LEAVE)value.setLeave_times(value.getLeave_times() + 1);8)退出率:页面退出率=该页面的退出次数/该页面的浏览量(pv)。本系统实现了两种类型的验证码,其中数字字母组合型验证码如下图4.4所示。9)独立IP访问数,计算是以一个独立的IP在一个计算时段内(默认为1天)访问网站计算为1次IP访问数。4.6.2 Stream grouping 策略在上述论述中,值得一提的是Storm中的消息流分组的策略,即流分组策略。由于一个节点能够发射的数据流数量不止一条,在建立项目搭建一个 拓扑程序的时候,我们需要定义一下数据流在各个组件之间的交换消费方法。流分组策略设置了每个 bolt运行时应该消费哪些Stream,即Stream被消费的方法。1、Shuffle 分组Shuffle 分组是Storm项目中最基础的消息分组方式。它数使用一个参数源组件发射消息单元到一个系统随机选择后续Bolt并能够确保集群中所有消费者会接收到数量相等的消息流。 本系统中主要的思想就是相关数学操作,使用Shuffle分组可以很大程度地提高系统运行效率,最大程度利用系统资源。但是会出现一些情景,我们的消息操作不能使用Shuffle 分组分布,例如计数操作,这时就需要考虑其他的分组。2、Fields 分组Fields 分组的实现是为了保证消息源里面一个联合域中指定的相关值集合会被发送到相同的处理Bolt中。它允许用户基于消息单元的一个或多个域来控制消息元祖被发送到集群里面Bolts的方法。比如按单词来分组, 具有相同的单词的元祖会被分到相同的Bolt, 而不同的单词则会被分配到另外不同的消息处理组件中。即产生过滤,从消息源端(上一级Bolt或Spout端)输出的Fields中选择某些特定的Field的作用,以此保证完全相同的元祖会被系统分发给同一个task或Executer处理。需要注意的是:使用本分组方式的时候,所有的fields都必须在消息源中就已经被声明。3、All 分组 All 分组能够保证所有元祖都能有一个单独的备份被发送到所有的接收Bolt的运行实例中。这种分组方式一般是作为sign的发送。例如,当用户需要更新浏览操作,拓扑程序可以向所有的Bolts发送一个更新的sign。在本系统中,我们可以通过All分组方式来增加实现清空缓存数据的功能。在WordCount程序中,可以通过使用 all 分组来增加清空缓存sign的功能if(input.getSourceStreamId().equals(signals) str = input.getStringByField(action);if(refreshCache.equals(str) counters.clear(); 在此增加了一个检查消息流的源的条件判断来。 Storm框架使得用户可以命名消息流,否则就是系统默认的名字。通过留的名字我们可以精确的查询判定tuple的源。4、自定义分组自定义分组策略赋予了开发者决定每一个tuple被发送到的Bolts的权利,可以通过implements CustomStreamGrouping这个接口来实现。例如在计数实例中,我们还可以根据单词的首字母来进行自定义分组,这样变可以使得具有相同首字母的word被发送到同一个Bolt当中。代码示例如下:public class ModuleGrouping implements CustomStreamGrouping, Serializableint numTasks = 0;public List chooseTasks(List values) List boltIds = new ArrayList();if(values.size()0)String str = values.get(0).toString();if(str.isEmpty() boltIds.add(0);else boltIds.add(str.charAt(0) % numTasks);/ 利用任务数量对单词首字母字符的int值取模return boltIds; public void prepare(TopologyContext context, Fields outFields, List targetTasks)numTasks = targetTasks.size();Topology中修改为:builder.setBolt(word-normalizer, new WordNormalizer() .customGrouping(word-reader, new ModuleGrouping(); 5、Direct 分组Direct 分组是由消息源来决定哪个后续组件将接收消息单元的分组。自定义分组类似。6、Global 分组这个分组在使用时会将所有消息源产生的tuple发送到一个特殊的目标组件中。 7、None 分组None 分组有点类似于Shuffle分组,也就是说,使用这一分组时,消息流的分组策略于系统运行没有影响。至此,本次毕设的详细设计与系统实现完成。5 系统测试5.1 测试方法本测试拟对本系统的Storm部分后台数据处理部分功能。主要利用白盒测试和黑盒测试相结合的方法进行数据分析测试,测试方式为手动测试。着手测试时,我先逐步检查自己的程序代码逻辑,再理清楚本系统所需要的几个功能点以及相关数据被处理后理论上应该出现的数据,然后将理论数据和测试结果数据进行对比,得出测试结果。1、先进行单条数据发射的测试,建立一个生产者,用于METAQ消息队列的数据的发射,也就是模拟前台对METAQ的消息发射。连续发射三条相同的数据,进行简单测试,查看逻辑是否正确。下面是消息生产者的关键代码:public class Produre public static void main(String args) throws MetaClientException,IOException, InterruptedException final MetaClientConfig metaClientConfig = new MetaClientConfig();final ZKConfig zkConfig = new ZKConfig();zkConfig.zkConnect = 08:2181;metaClientConfig.setZkConfig(zkConfig);/ 由消息工厂创建消息ProducerMessageSessionFactory sessionFactory = new MetaMessageSessionFactory(metaClientConfig);/ 消息Producer的接口是线程安全的/ 查找服务器并创建topic发送消息,每个Message都是Message类的一个实例MessageProducer producer = sessionFactory.createProducer();/final String topic = ECAP_CDRCB;final String topic = ECAP_CDRCB;producer.publish(topic);System.out.println(请输入消息并回车:);BufferedReader reader = new BufferedReader(new InputStreamReader(System.in);String line = null;while (line = reader.readLine() != null) System.out.println(line);/ send messageSendResult sendResult = producer.sendMessage(new Message(topic,line.getBytes(UTF-8);/ check resultif (!sendResult.isSuccess() System.err.println(Send message failed,error message:+ sendResult.getErrorMessage() + n请输入消息并回车:); else System.out.println(Send message successfully,sent to + sendResult.getPartition() + n请输入消息并回车:);2、再将项目代码打包放到内网环境中,用缓存一天的部分数据进行测试,查看批量处理是的速率和稳定性,还有最终结果。3、追踪单条URL在24小时内,一周内的所有指标情况,并多次验证。测试主要从以下几方面展开:(1)消息中间件对于消息的接收和传递;(2)更新数据库操作的频率和消息法索频率,以及type5消息的处理;(3)网站概况模块(天,小时)各个指标;(4)访客时间模块(天,小时)各个指标;(5)错误信息提醒是否准确;(6)topology是否能正常连续运行;(7)消息中文是否乱码,表中数据是否对应列名,是否存在数据丢失的情况;5.2 测试环境与目的公司内网,即是和开发环境相关配置一致的软件环境。在公司内网的测试环境下,按照既定方案,通过前台采集的数据通过metaq中间件按照每隔5秒接收并发送消息通过shuffle进行分组保持数据均衡的情况下分别运行出不同模块Bolt的计算结果。根据配置文件中的数据库中的结果,对比理论值与测试结果的差异,最终用于评判系统数据的准确性和整个项目架构的可行性。5.3 测试结果与分析5.3.1 网站概况模块网站概况页面如下图5.1所示。图5.1 网站概况页面相关数据指标对比分析结果如下:l url:浏览量理论值为/wl/,与运行结果相同。l url_name:浏览量理论值为首页,与运行结果相同。l 浏览量:浏览量理论值为138,与运行结果相同。l 访客数:访客数的理论值为128,与运行结果相同。l 访问时长:此值测试的理论值为105,与运行结果相同。l 作为离开页的次数:作为离开页的次数理论值为0,与运行结果相同。l 作为入口页的次数:作为入口页的次数理论值为0,与运行结果相同。l reason:理论值是pv,与运行结果一致。l 跳出数:跳出数的理论值为105,与运行结果相同。5.3.2 访问时间模块访客时间统计模块页面如下图5.2所示。图5.2 访客时间统计页面相关数据指标对比分析结果如下:l url:浏览量理论值为/wl/,与运行结果相同。l url_name:浏览量理论值为首页,与运行结果相同。l 浏览量:浏览量理论值为138,与运行结果相同。l 访客数:访客数的理论值为128,与运行结果相同。l 访问时长:此值测试的理论值为105,与运行结果相同。l ip数:此值测试的理论值为119,与运行结果相同。l 跳出数:跳出数的理论值为119,与运行结果相同。根据上述的测试结果,可以清楚地看出到此我们系统已完成需求中所有的功能细节,系统运行性能也符合要求。5.3.3 测试总结(1)m
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:51实时网站流量监控分析系统【软件工程毕业论文设计说明书开题翻译PPT代码】.zip
链接地址:https://www.renrendoc.com/p-22640765.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!