storm滑动时间窗口实现
来源:互联网 发布:八零网络验证1.3下载 编辑:程序博客网 时间:2024/06/05 20:01
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
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);
}
}
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
1 0
- storm滑动时间窗口实现
- Storm 时间滑动窗口+topN+Hbase
- 滑动窗口在storm中的实现
- 滑动窗口在storm中的实现
- Storm滑动窗口实现批量计算
- Storm 实现滑动窗口计数和TopN排序<转>
- Storm 实现滑动窗口计数和TopN排序 【转】
- Storm 实现滑动窗口计数和TopN排序
- storm 1.0版本滑动窗口的实现及原理
- storm 1.0新功能--Windowing Support in Core Storm滑动窗口
- 滑动窗口的实现
- 【转】动窗口在storm中的实现
- 【转】 QT实现滑动窗口
- 时间序列(三)滑动窗口
- storm-窗口
- java滑动窗口(实现平滑数据量)
- duilib : 滑动显示的窗口实现
- QSplitter实现自由伸缩滑动窗口部件
- [Kubernetes]Kubernetes集群和Docker私有库搭建(CentOS 7)
- Android依赖注入:Dagger、RoboGuice和ButterKnife
- ios--Quartz2绘图
- 解决myeclipse导入maven工程时问题:No marketplace entries found to handle maven-compiler-plugin:2.3.2
- Groovy(一)环境搭建
- storm滑动时间窗口实现
- CFree C/CPP 调试教程
- 如何在阿里云上部署django(番外篇)
- 【杭电】[2120]Ice_cream's world I
- 编程题:有两个字符串str1和str2,写一个函数实现在str1中查找str2的初始位置,要求不区分大小写
- SpringMVC的HelloWorld实现
- Debian系统修改IP及DNS(系统版本Debian8.0)
- MongoDB学习(一)介绍
- HDU 5326 Work (并查集)
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
安丘手工活信息
山东安丘房价
安丘特色饭店
安丘青云双语学校
安丘开发区医院
安丘皮肤病研究所
安丘建筑机械
安丘房子价格
安丘云湖假日酒店
安丘青云湖游乐园门票
淄博到安丘的汽车
昌乐县
安东
安东侯府
安东迷你仓
安东医生
安东市
下安东
上安东
安丰
安丰镇
兴化安丰镇
寿县安丰镇
兴化市安丰镇花店
安丰属于哪个市
兴化安丰镇镇长被捕
兴化安丰
安丽
安久顾墨
安久
安久顾墨全文免费阅读
安义县
安义
南昌安义
安九
安九高铁
安乡县
安乡
安乡论坛
安乡房价
安乡鲜花店