storm滑动时间窗口实现

storm是一个流式处理框架,可以做到Spout产生一条数据,Bolt处理一条以达到实时计算。
这种模式并不是实际的业务需要的,我们更多是需要 最近5分钟的PV  UV ,最近10分钟的网络最大延迟,最近5分钟页面访问TOP10
这类问题都可以抽象为: 每隔M秒统计最近N秒内的数据,即我们需要一个滑动窗口(固定时间段)来控制数据流量
因为storm 未提供api封装,滑动窗口只能自己来实现
我们先来看一个特殊的场景 M = N  = 5时,即每隔5秒钟计算最近5秒中最大网络延迟
我们可以在Bolt定义一个List<Tuple> 作为cache,每次execute来给put到cache,等到时间过了5秒就立即从cache提取数据做计算

但是如果M != N时,即每隔5秒计算最近20秒内的数据就无能为力了
同样的原理,我们也是提供一个cache用来缓存最近时间的消息,此外还要实现两点:
1,如何实现每隔设定的时间批量提交一次Tuple
2,设计一个怎样的存储结构及算法以方便获得设定滑动窗口内的Tuples 

比方说:要实现一个每M=2秒计算最近N=6秒内的交易UV、交易额
在Bolt就需要每个2秒获取窗口长度为6秒的Tuple并做处理.

第二点也是滑动窗口实现的核心
设定两个数,Tick频率——batch的时间间隔(2秒),滑动窗口的长度(6秒)
我们把移动窗口划分成6/2=3个Slots,每个Slot存储2秒内收到的Tuple

我们的Cache采用 Map<Integer,List<T>> key为slotIndex,value为当前slot时间内收到的消息tuple
storm每触发一次Tick就获取当前窗口的Tuples计算,同时像后滑动一次窗口,通过(headSlot,tailSlot)控制
SlidingWindowBolt的代码如下:
SlidingWindowCache.java
WindowedBolt.java
WindowedBolt有三个抽象方法:
要实现滑动窗口的Bolt只需要extends它实现这三个方法即可,就跟写一个普通的Bolt唯一区别在于emitCurrentWindowCounts,我们来实现一个SumupBolt来实现每2秒计算滑动窗口长度为6秒的所有数据之和
SumupBolt.java#emitCurrentWindowCounts


package com.bj58.learningstorm;
import backtype.storm.Constants;
import backtype.storm.tuple.Tuple;


public final class TupleHelpers {

private TupleHelpers() {}  
  
    public static boolean isTickTuple(Tuple tuple) {  
        return tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)  
                && tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID);  
    }  
}

构建Topology

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值