Storm计算网站PV和UV(实现可靠处理)

需求分析

编写Storm拓扑实现可靠计算网站当日PV和UV

重点:

  1. 去重计算模式
  2. 实现可靠处理

电商常用指标之PV、UV、VV、独立IP

  • PV(访问量):Page View, 即页面浏览量或点击量,用户每次访问即被计算一次。
  • UV(独立访客):Unique Visitor, 访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只会被计算一次。
  • VV即Visit View,访客访问的次数,用以记录所有访客一天内访问量多少次网站。
  • IP(独立IP):指独立IP数。00:00-24:00内相同IP地址之被计算一次。

如果我们要统计一个网站当日有多少实际用户访问,使用UV也就是独立用户作为统计量有什么好处?它比独立IP的统计更加准确吗?

比如你早上8点使用PC访问了某商城的两个页面,下午2点又使用手机访问了这个商城网站的3个页面, 那么对于这个商城网站, 当日的PV、UV、VV、IP各项指标该如何计算呢?

PV为5, PV指浏览量,因此PV指等于上午浏览的2个页面和下午浏览的3个页面之和;

UV为1, UV指独立访客数,因此一天内同一访客的多次访问只计为1个UV;

VV为2, VV指访客的访问次数,上午和下午分别有一次访问行为,因此VV为2

IP为2, IP为独立IP数,由于PC和手机访问时的IP不同,因此独立IP数为2.

可见IP是一个反映网络虚拟地址对象的概念,UV是一个反映实际使用者的概念,每个UV相对于每个IP更加准确地对应一个实际的浏览者。

方案设计

综上所述:使用UV作为统计量,可以更加准确的了解单位时间内实际上有多少个访问者来到了相应的页面。

用Cookie携带的SessionID分析UV值:当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个Cookie,通常放在这个客户端电脑的C盘当中。在这个Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。

如果把sessionID 放入Set集合实现自动去重,再通过Set.size() 获得UV。该方案在单线程和单JVM下没有问题。高并发情况的多线程情况不适用。

推荐的方案:编写Storm拓扑, Spout获取外部服务器日志然后再通过shuffleGrouping发给多个下级bolt进行数据清洗, 清洗后的数据通过fieldGrouping 进行多线程局部汇总得到,下级blot进行单线程保存sessionID和count数到Map,下一级blot3进行Map遍历,可以得到:Pv、UV、访问深度(每个session_id 的浏览数)

file

创建IDEA项目(基于Maven)

pom.xml

项目结构

file

代码编写

创建工具类cn.delucia.storm.utils.SocketClientUtil

创建类cn.delucia.storm.log.LogTopology

创建类cn.delucia.storm.log.LogMockSpout

创建类cn.delucia.storm.log.LogCheckBolt

创建类cn.delucia.storm.log.LogCountBolt

创建类cn.delucia.storm.log.LogGlobalSumBolt

本地运行

在本机安装netcat,使用一下命令开启Socket Server:

然后本地运行项目(不要带参数),等待Socket Server接收到输出结果,如图所示:

file

本地提交打好的jar包提交到远程集群运行

首先在pom.xml中将依赖storm-core的scope改为provided
再使用maven package打包,生成的文件在项目根目录下的target文件夹内
修改LogTopology.java中的代码,指定jar包的本地提交路径:

然后直接运行项目,即可通过Thrift协议协议将jar包远程提交到集群中的nimbus节点运行。
最后可以在Storm UI界面查看结果。

Views: 325

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注