利用storm1.0的窗口机制做pv统计(一)

标签: storm窗口统计
49人阅读 评论(0) 收藏 举报
分类:

       近期需要用storm(1.0版本)做pv统计,现在通过博客把topology的设计,coding,和上线调优的过程记录下来,留着给做相关事情的小伙伴阅读一下。

       一. 首先叙述一下业务场景,网站的访问信息被网关层nginx记录下来,nginx日志以json的数据结构发到我们的kafka消息队列中,需要利用storm实时处理平台去fetch数据,将数据指标按照不同的访问域,不同的访问方法,和一定的时间窗口频度进行统计,结果保存在mysql中,供前端监控页面展示。

        二,废话不多说,先上topology设计的DAG

            

        commonSpout从kafka中拿到数据之后,进行简单的转码解析(尽量把只负责处理数据类型和简单的筛选逻辑),emit到第一层executeBolt(extends BaseBasicBolt),并行度为3(暂定,后续会根据运行情况调节),分组为Shuffle Grouping(后面会解释为什么用这个分组),然后在executeBolt里分析数据,把域名,请求方法名,请求分段时间标志作为Map的key,利用stom的心跳机制,在Bolt中的getComponentConfiguration()方法中设置executeBolt的心跳频率,以统计频率为一分钟为例,定时的让tickTuple按设置的时间发送给Bolt中的execute(),代码片段如下:

public Map<String, Object> getComponentConfiguration() {
        //设置发送ticktuple的时间间隔
       Config conf = new Config();
         conf.put(conf.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 60);
        return conf;
     }

        这样,在execute()中可以进行按照频率进行数据积攒,得到1min中的窗口Map。将Map.toString()发向windowBolt。

        在介绍第二层Bolt前,先介绍一下storm1.0的窗口的机制,这个机制是在storm1.0版本之后引入的,可以解决实时统计场景中典型的窗口计算问题:例如每隔m时间,就计算n时间内窗口的数据;每隔k条数据,就计算j条数据内窗口的数据;每隔m时间,就计算j条数据内窗口的数据;每隔k条数据,就计算n时间内窗口的数据。通过构建topology时候简单的参数配置,实现了窗口数据的捕获,开发者只需关注窗口内的处理逻辑即可,而不需要为积攒窗口数据复制而低效的逻辑而操心。例如此topology中的windowBolt被我设计为,每隔3条数据,就计算3条数据中的数据,进行汇总。那么为什么这么设计呢?其实这是有一个过程的,设计之初,这种pv统计的问题有一个最关键的地方,就是如何设置好你的并行计算和全局统计,简单来说,如果全程下来是单个线程的spout,单个线程的bolt,那么,统计出来的数据是准确的,没有问题,但是随着数据量级的增加,计算压力的增大,在executeBolt中的计算压力增大,需要设置并行计算,这样,多个线程一起利用心跳做累计,每个线程计算的只是部分的数据,而并不是全局的,如果在统计场景,在mysql里出现的是多条同样的key的数据,本质上来说,只是增大了数据的粒度,而并没有进行准确的统计。后来为了解决这个问题,引入了第二层bolt,即窗口bolt,让第一层的bolt统一把计算结果发给窗口统计Bolt,这样相当于窗口Bolt做了一个全局的汇总,从而实现了全局数据的统计,第三层Bolt的并行度一定要只为1,否则将不能实现窗口统计全局唯一的功能,那么这个时候我们不仅要问,这样一来窗口Bolt的压力不会大吗??其实这样的设计结构需要你把所有的计算压力全都放在第一层可并行的bolt中,让统计Bolt只做简单的数据统计叠加就可以了,把解析和逻辑处理这种耗费cpu的压力全部都给第一层Bolt去做。这样设计的topology就可以保证统计的准确性,并将计算和统计解耦。

        那么我来解释一下分组选用的原因,我第窗口Bolt的设计是每收到3条,就统计3条的数据的窗口,进行计算,为什么这样呢?因为executeBolt的并行度是3,也就是说数据进来之后,我必须保证每一个Bolt都不阻塞,按照顺畅的工作模式去处理数据,也就是数据要均匀的通过我的第一层Bolt,假设通过6条,那么一定是随机分组,我的三个并行里都能拿到2条,这样第二层Bolt才能按照3-3的标准去统计,在全局中计算这6条数据,如果不是随机分组,那么executeBolt中并行的数据不均匀,第二层的按照条数计算的窗口就会出现消费缓慢,或者极端情况下,一直不计算的问题。

这里面后续优化性能的过程中有两个参数注意:

1.第一层Bolt的并行度一定要和第二层窗口层的统计维度条数一样

2.第二层窗口Bolt的并行度一定只能为1

下面写一下窗口bolt的API。

withWindow(Count windowLength, Count slidingInterval)

  每收到slidingInterval条数据统计最近的windowLength条数据。

withWindow(Count windowLength)

  每收到1条数据统计最近的windowLength条数据。

withWindow(Count windowLength, Duration slidingInterval)

  每过slidingInterval秒统计最近的windowLength条数据。

withWindow(Duration windowLength, Count slidingInterval)

  每收到slidingInterval条数据统计最近的windowLength秒的数据。

withWindow(Duration windowLength, Duration slidingInterval)

  每过slidingInterval秒统计最近的windowLength秒的数据。

withWindow(Duration windowLength)

  每收到1条数据统计最近的windowLength秒的数据。

        在构建Topology时通过此代码片段即可:

builder.setBolt("windowBolt",new WindowBolt().withWindow(Count windowLength, Count slidingInterval),1).shuffleGrouping("上一个Bolt");
于是,通过这样的一个Topology设计,便实现了Pv窗口统计功能,为监控方实时提供了数据。


查看评论

014-案例开发.Storm计算网站PV

高并发多线程下采用storm统计网站的pv数据
  • shenfuli
  • shenfuli
  • 2015-10-12 12:54:09
  • 2076

015-Storm计算网站UV(去重计算模式)

通过Storm统计uv和pv,其中uv去重,解决高并发多线程下uv和pv统计出错问题。
  • shenfuli
  • shenfuli
  • 2015-10-12 15:42:53
  • 4752

使用Storm实现实时大数据分析

简单和明了,Storm让大数据分析变得轻松加愉快。 当今世界,公司的日常运营经常会生成TB级别的数据。数据来源囊括了互联网装置可以捕获的任何类型数据,网站、社交媒体、交易型商业数据以及其它商业环...
  • wl6965307
  • wl6965307
  • 2016-08-03 16:47:11
  • 3469

利用storm1.0的窗口机制做pv统计(一)

       近期需要用storm(1.0版本)做pv统计,现在通过博客把topology的设计,coding,和上线调优的过程记录下来,留着给做相关事情的小伙伴阅读一下。       一. 首先叙述...
  • weixin_40209426
  • weixin_40209426
  • 2018-04-15 23:39:58
  • 49

storm对网站有关数据的统计以及多线程问题探讨

网站最常用的两个指标 pv: count(session_id) uv: count(distinct session_id) session_id是针对浏览器来说的,用户一进来就有 多线程下...
  • zengxiaosen
  • zengxiaosen
  • 2016-10-06 19:29:49
  • 198

shell统计pv和uv、独立ip的方法

每天分析日志的哥们实在伤不起,经常需要给出PV,UV,独立IP等一些统计值,使用C/C++,java都可以写,过程是这样的,先读取文件,逐行扫描,把能标记的值放入数据结构中,排重得出最终结果,其实Li...
  • ljp812184246
  • ljp812184246
  • 2016-04-17 21:52:31
  • 1315

shell统计Apache访问日志中指定页面的PV、UV等指标

最近由于运营需要,写了诸多shell脚本统计Apache日志中指定页面的PV、UV等指标。今天把这些脚本贴出来,留待后用。但凡程序,都是有改进的余地的,只看你是否有心去做。 前提:因为项目和电信移动...
  • allenq588
  • allenq588
  • 2012-03-23 11:52:04
  • 4359

统计网站pv数

//统计网站pv数 if(is_file("pv.txt")){ //有 $count = file_get_contents("pv.txt"); $count += 1; echo ...
  • jiaqingge
  • jiaqingge
  • 2016-11-29 13:37:30
  • 116

使用Spark计算PV、UV

版权声明:本文为博主原创文章,未经博主允许不得转载。 日志字段格式: id,ip,url,ref,cookie,time_stamp 把日志文件放到HDFS。仅取了1000行。 ...
  • qiezikuaichuan
  • qiezikuaichuan
  • 2016-07-24 22:52:43
  • 2046

mapreduce 统计PV UV

在互联网环境下,一般网站都需要堆网站的pv,uv进行数据统计,简单理解下pv 就是url被访问的次数,uv则是url被不同ip访问的次数,ok 问题来了,一个文本日志,数据格式为:data,url,i...
  • chuwanfei
  • chuwanfei
  • 2017-06-25 17:04:52
  • 1363
    个人资料
    等级:
    访问量: 0
    积分: 20
    排名: 0
    文章分类
    文章存档