网站访问量实时统计

article/2025/9/30 0:12:38

一、需求:统计网站访问量(实时统计)

技术选型:特点(数据量大、做计算、实时)实时流式计算框架:storm1)spout
数据源,接入数据源
本地文件2)splitbolt
业务逻辑处理
切分数据
拿到网址3)bolt
累加次数求和

1、PvCountSpout类

package com.demo.pvcount;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichSpout;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Values;

public class PvCountSpout implements IRichSpout{private SpoutOutputCollector collector;private BufferedReader br;private String line;@Overridepublic void nextTuple() {//发送读取的数据的每一行try {while((line = br.readLine())!= null) {//发送数据到splitboltcollector.emit(new Values(line));//设置延迟Thread.sleep(500);}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void open(Map arg0, TopologyContext arg1, SpoutOutputCollector collector) {this.collector = collector;//读取文件try {br = new BufferedReader(new InputStreamReader(new FileInputStream("e:/weblog.log")));} catch (FileNotFoundException e) {e.printStackTrace();}}@Overridepublic void declareOutputFields(OutputFieldsDeclarer declarer) {//声明declarer.declare(new Fields("logs"));}//处理tuple成功 回调的方法
    @Overridepublic void ack(Object arg0) {}//如果spout在失效的模式中 调用此方法来激活
    @Overridepublic void activate() {}//在spout程序关闭前执行 不能保证一定被执行 kill -9 是不执行 storm kill 是不执行
    @Overridepublic void close() {}//在spout失效期间,nextTuple不会被调用
    @Overridepublic void deactivate() {}//处理tuple失败回调的方法
    @Overridepublic void fail(Object arg0) {}//配置
    @Overridepublic Map<String, Object> getComponentConfiguration() {return null;}
}

2、PvCountSplitBolt类

package com.demo.pvcount;import java.util.Map;import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;

public class PvCountSplitBolt implements IRichBolt{private OutputCollector collector;//一个bolt即将关闭时调用 不能保证一定被调用 资源清理
    @Overridepublic void cleanup() {}private int pvnum = 0;//业务逻辑 分布式 集群 并发度 线程 (接收tuple然后进行处理)
    @Overridepublic void execute(Tuple input) {//1.获取数据String line = input.getStringByField("logs");//2.切分数据String[] fields = line.split("\t");String session_id = fields[1];//3.局部累加if (session_id != null) {//累加pvnum++;//输出collector.emit(new Values(Thread.currentThread().getId(),pvnum));}}//初始化调用
    @Overridepublic void prepare(Map arg0, TopologyContext arg1, OutputCollector collector) {this.collector = collector;}//声明
    @Overridepublic void declareOutputFields(OutputFieldsDeclarer declarer) {//声明输出declarer.declare(new Fields("threadid","pvnum"));}//配置
    @Overridepublic Map<String, Object> getComponentConfiguration() {return null;}
}

3、PvCountSumBolt类

package com.demo.pvcount;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.IRichBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.tuple.Tuple;

public class PvCountSumBolt implements IRichBolt{private HashMap<Long, Integer> hashMap = new HashMap<>();@Overridepublic void cleanup() {}//全局累加求和 业务逻辑
    @Overridepublic void execute(Tuple input) {//1.获取数据Long threadid = input.getLongByField("threadid");Integer pvnum = input.getIntegerByField("pvnum");//2.创建集合 存储(threadid,pvnum) 15 20
        hashMap.put(threadid, pvnum);//3.累加求和(拿到集合中所有value值)Iterator<Integer> iterator = hashMap.values().iterator();//4.清空之前的数据int sumnum = 0;while (iterator.hasNext()) {sumnum += iterator.next();}System.err.println(Thread.currentThread().getName() + "总访问量为->" + sumnum);}@Overridepublic void prepare(Map arg0, TopologyContext arg1, OutputCollector arg2) {}@Overridepublic void declareOutputFields(OutputFieldsDeclarer arg0) {}@Overridepublic Map<String, Object> getComponentConfiguration() {return null;}
}

4、PvCountDriver类

package com.demo.pvcount;import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;public class PvCountDriver {public static void main(String[] args) {// 1.hadoop->Job storm->topology 创建拓扑TopologyBuilder builder = new TopologyBuilder();// 2.指定设置builder.setSpout("PvCountSpout", new PvCountSpout(), 1);builder.setBolt("PvCountSplitBolt", new PvCountSplitBolt(), 6).setNumTasks(4).fieldsGrouping("PvCountSpout", new Fields("logs"));builder.setBolt("PvCountSumBolt", new PvCountSumBolt(), 1).fieldsGrouping("PvCountSplitBolt", new Fields("pvnum"));// 3.创建配置信息Config conf = new Config();conf.setNumWorkers(2);// 4.提交任务LocalCluster localCluster = new LocalCluster();localCluster.submitTopology("pvcounttopology", conf, builder.createTopology());}
}

5、PvCountDriver_Shuffle类

package com.demo.pvcount;import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.topology.TopologyBuilder;public class PvCountDriver_Shuffle {public static void main(String[] args) {// 1.hadoop->Job storm->topology 创建拓扑TopologyBuilder builder = new TopologyBuilder();// 2.指定设置builder.setSpout("PvCountSpout", new PvCountSpout(), 1);builder.setBolt("PvCountSplitBolt", new PvCountSplitBolt(), 6).setNumTasks(4).shuffleGrouping("PvCountSpout");builder.setBolt("PvCountSumBolt", new PvCountSumBolt(), 2).shuffleGrouping("PvCountSplitBolt");// 3.创建配置信息Config conf = new Config();conf.setNumWorkers(2);// 4.提交任务LocalCluster localCluster = new LocalCluster();localCluster.submitTopology("pvcounttopology", conf, builder.createTopology());}
}

6、weblog.log文件

storm.apache.org    EEH6Y21245GHI899OFG4V9U567    2018-08-07 10:40:49
storm.apache.org    VVVYH6Y4V4SFXZWWEQRQWEQ    2018-08-07 08:40:50
storm.apache.org    BBYH61456DEL89RG5VV9UYU7    2018-08-07 10:40:49
storm.apache.org    EEH6Y21245GHI899OFG4V9U567    2018-08-07 09:40:49
storm.apache.org    CCYH6Y4V4SCVXTG6DPB4VH9U123    2018-08-07 10:40:49
storm.apache.org    CCYH6Y4V4SCVXTG6DPB4VH9U123    2018-08-07 12:40:49
storm.apache.org    VVVYH6Y4V4SFXZWWEQRQWEQ    2018-08-07 08:40:52
storm.apache.org    CCYH6Y4V4SCVXTG6DPB4VH9U123    2018-08-07 08:40:50
storm.apache.org    VVVYH6Y4V4SFXZWWEQRQWEQ    2018-08-07 09:40:49...
...
...
storm.apache.org EEH6Y21245GHI899OFG4V9U567 2018-08-07 08:40:53 storm.apache.org BBYH61456DEL89RG5VV9UYU7 2018-08-07 12:40:49 storm.apache.org EEH6Y21245GHI899OFG4V9U567 2018-08-07 08:40:51 storm.apache.org EEH6Y21245GHI899OFG4V9U567 2018-08-07 10:40:49 storm.apache.org HUNTERH6YCGFJYERTT834R52FDXV9U34 2018-08-07 08:40:53 storm.apache.org BBYH61456DEL89RG5VV9UYU7 2018-08-07 08:40:50 storm.apache.org EEH6Y21245GHI899OFG4V9U567 2018-08-07 08:40:53 storm.apache.org VVVYH6Y4V4SFXZWWEQRQWEQ 2018-08-07 10:40:49

7、运行(4)中的main方法,控制台显示如下图:

此时在weblog.log文件中增加几条数据,则总访问量相应增加几条。

至此,简单实现了网站访问量实时统计。

 

转载于:https://www.cnblogs.com/areyouready/p/10188300.html


http://chatgpt.dhexx.cn/article/NBG19vu3.shtml

相关文章

如何实现网站访问量统计(html页面)

如何为HTML网页添加访问计数器 如何实现网站访问量统计 不利用站长之家实现网站访问量统计 一行代码实现访问量统计 1. 访问http://www.amazingcounters.com/index.php网站 2. 进入网站后选择Sign Up 3. 选择一个能看的统计数字界面 4. 然后拉到底端进入下一步

统计网站的访问次数

本文介绍如何利用ServletContext统计一个网站的访问总量&#xff0c;而不是分IP地址统计网站的访问次数。这个练习题是一个固定的模型&#xff0c;先获取值&#xff0c;然后对值进行判断&#xff0c;如果值存在如何处理&#xff0c;如果值不存在又如何处理&#xff0c;然后输出…

web开发技术重点

一、单项选择 (30题共30分) 来自课后习题html、css 二、判断 (10题共10分) 来自课后习题html、css 三、简答题 (4题共20分) 八选四 P24 简述HTML代码书写规范 (1)标签可以嵌套使用&#xff0c;但要注意标签间的前后匹配&#xff0c;避免引起交叉而出现语法错误…

JavaWeb技术

目录 背景&#xff1a;B/S架构&#xff1a;静态资源&#xff1a;动态资源&#xff1a; Tomcat&#xff1a;Maven创建Web项目&#xff1a;使用骨架&#xff1a;Tomcat Maven插件 ServletServlet 执行流程Servlet 生命周期urlPattern配置Request请求参数中文乱码解决方案请求转发…

WEB技术与应用---概述

WEB技术与应用–概述 万维网 概述&#xff1a;万维网www&#xff08;world wide web&#xff09; 1.web模型 2.web客户端 3.web服务器 超链接&#xff1a; 超链接指向的资源可以处于lnternet的任一Web服务器之中&#xff0c; 利用超链接Web页面可以与其他Web页面进行关联。…

web各个技术

Web 知识框架 控制浏览器行为技术&#xff1a;HTML 、CSS 、JavaScript控制硬盘上数据库行为技术&#xff1a;MySql数据库服务器管理使用&#xff08;SQL重点&#xff09;、JDBC规范控制服务端Java行为技术&#xff1a;Http服务器、Servlet、JSP互联网通信流程开发规则&#…

Web技术的发展

定义&#xff1a; 本意是蜘蛛网和网的意思&#xff0c;在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式&#xff0c;即超文本&#xff08;hypertext&#xff09;、超媒体&#xff08;hypermedia&#xff09;、超文本传输协议&#xff08;HT…

WEB简介

WEB 一、Web简介 1、 简介 早期的web应用主要是静态页面的浏览&#xff0c;这些静态页面使用HTML语言编写&#xff0c;放在服务器上&#xff0c;用户使用浏览器通过HTTP协议请求服务器上的web页面&#xff0c;服务器上的web服务器软件接受到用户发送的请求后&#xff0c;读取…

Web开发

一、什么是Web开发? Web开发其实就是Web应用开发 在 PC&#xff08;Personal Computer&#xff0c;个人计算机&#xff09;刚兴起的年代&#xff0c;软件主要使用 C/S 架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09;即应用运行在桌面上&#xff0c;而…

常见Web技术之间的关系,你了解多少?

引 ------------------------------------------------------------------------------------------------------------ 如果你是一个Web开发初学者&#xff0c;那么你难免会在网上搜索HTML&#xff0c;CSS&#xff0c;XML&#xff0c;JS&#xff08;Javascript&#xff09;&…

Web技术发展史

Web技术发展史 Web开发指的是网页系统开发&#xff0c;每次在浏览器中输入网址时&#xff0c;总会先输入www&#xff0c;这里其实是World Wide Web的简称&#xff0c;现在也简称Web&#xff0c;中文译为万维网。 Web设计初衷是一个静态信息资源发布媒介&#xff0c;通过超文本…

web前端主要技术概述

web前端主要技术概述 参考资料&#xff1a; 2018 Web 开发者路线图 2017年前端框架、类库、工具大比拼 本文主要是介绍部分主流和新兴的web前端技术&#xff0c;希望能帮助想学web前端的小白&#xff0c;理清其技术学习路线。 首先有些技能是web前端需要掌握的&#xff1a…

Web技术基础

前言 当我们还没有接触Web时&#xff0c;可能处理的都是静态网页如Html,这个网页的数据都是直接写在标签里写死的&#xff0c;那么如果我们要做类似淘宝的一个网站,数据每天都会更新&#xff0c;那么静态网页就不支持了&#xff0c;就需要从数据库里去拿数据&#xff0c;来用动…

web端基本技术点整理

1 WEB端概述 1.1 前端框架演变 https://blog.csdn.net/bjweimengshu/article/details/79563440 1.2 技术概览 https://blog.csdn.net/fighting_no1/article/details/79599806 1.3 学习路线 https://blog.csdn.net/zwjweb/article/details/78704342 https://blog.csdn.net/zwjwe…

数据可视化网页内容自动抓取工具

网页内容提取支持我们对公开的网页信息数据进行提取&#xff0c;如果通过人工对网页数据采集&#xff0c;是一个繁琐的工作&#xff0c;网页内容提取工具通过可视化的操作页面&#xff0c;模拟人工进行网页内容提取&#xff0c;能快速获取整个网站的对应元素。 网页内容提取工具…

抓取网站的5种方法

来自维基百科 Web爬虫&#xff08;有时也称为蜘蛛&#xff09;是一种Internet机器人&#xff0c;通常系统地浏览Web索引&#xff0c;以进行Web索引。 Web搜寻器以要访问的URL列表&#xff08;称为种子&#xff09;开始。搜寻器访问这些URL时&#xff0c;它会识别页面中的所有超…

如何抓取网页数据

如何抓取网页数据&#xff0c;每当我们在网上找到自己想到的数据&#xff0c;都需要复制粘贴或下载然后一步一步地整理。今天教大家如何快速地免费获取网页数据信息&#xff0c;只需要输入域名点选你需要的数据&#xff0c;软件全自动抓取。支持导出各种格式并且已整理归类。详…

爬取动态网页数据的软件-抓取动态网页数据的工具

爬取动态网页数据&#xff0c;随着时代的进步&#xff0c;互联网的发展&#xff0c;不管是企业还是个人都知道了数据的重要性。今天给大家分享一款免费爬取动态网页数据的软件。只要点点鼠标就能轻松爬取到你想要的数据&#xff0c;不管是导出还是自动发布都支持&#xff01;详…

工具说明书 - 网页内容抓取工具Web Scraper(一)

Web Scraper&#xff0c;官网自称为排名第一的网页抓取/提取插件&#xff0c;可以安装在Chrome和Firefox上。 安装路径&#xff1a; https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn?hlenhttps://chrome.google.com/…

如何进行网页抓取数据??

最近老是做导数据&#xff0c;有时候没有旧库了&#xff0c;我们可以从老网页抓取数据 主要思路&#xff1a;通过把网页转换成doc式的html,然后进行获取元素的值 我来写个案例&#xff1a; 这是目标网页&#xff1a; http://zxjg.yn.gov.cn/zxjg/gongshi?rowIndex1&re…