Storm Windowing storm滑动窗口简介
Storm Windowing
简介
Storm可同时处理窗口内的所有tuple。窗口可以从时间或数量上来划分,由如下两个因素决定:
- 窗口的长度,可以是时间间隔或Tuple数量;
- 滑动间隔(sliding Interval),可以是时间间隔或Tuple数量;
要确保topo的过期时间大于窗口的大小加上滑动间隔
Sliding Window:滑动窗口
按照固定的时间间隔或者Tuple数量滑动窗口。
- 如果滑动间隔和窗口大小一样则等同于滚窗,
- 如果滑动间隔大于窗口大小则会丢失数据,
- 如果滑动间隔小于窗口大小则会窗口重叠。
Tumbling Window:滚动窗口
元组被单个窗口处理,一个元组只属于一个窗口,不会有窗口重叠。
根据我自己的经验其实一般用滚动就可以了
构造builder的时候支持以下的配置
(时间和数量的排列组合):
- withWindow(Count windowLength, Count slidingInterval)
滑窗 窗口长度:tuple数, 滑动间隔: tuple数 - withWindow(Count windowLength)
滑窗 窗口长度:tuple数, 滑动间隔: 每个tuple进来都滑 - withWindow(Count windowLength, Duration slidingInterval)
滑窗 窗口长度:tuple数, 滑动间隔: 时间间隔 - withWindow(Duration windowLength, Duration slidingInterval)
滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔 - withWindow(Duration windowLength)
滑窗 窗口长度:时间间隔, 滑动间隔: 每个tuple进来都滑 - withWindow(Duration windowLength, Count slidingInterval)
滑窗 窗口长度:时间间隔, 滑动间隔: 时间间隔 - withTumblingWindow(BaseWindowedBolt.Count count)
滚窗 窗口长度:Tuple数 - withTumblingWindow(BaseWindowedBolt.Duration duration)
滚窗 窗口长度:时间间隔
Tuple时间戳和乱序
storm支持追踪源数据的时间戳。
Event time 和Process time
默认的时间戳是处理元组时的bolt窗口生成的,
Event time,事件时间,通常这个时间会带在Tuple中;
Process time,到某一个处理环节的时间。
举例:A今天早上9点告诉B,说C昨天晚上9点在滨江国际;
这条信息中,可以认为C在滨江国际的Event time是昨天晚上9点,B接收到这条信息的时间,即Process time,是今天早上9点。
配置时间戳字段(timestamp field)
windows按照时间划分时,默认是Process time,也可以指定为Tuple中的Event time。
如果以Event time来划分窗口:
- Tuple落入到哪个窗口,是看tuple里的Event time。
- 窗口向后推进,主要依靠Event time的增长;
public BaseWindowedBolt withTimestampField(String fieldName)
延时(lag)和水位线(watermark)
从当前最后一条数据算起,往前减去lag,得到一个时间,这个时间就是watermark;
认为watermark之前的数据都已经到了。收到06:01:00的数据时,认为06:00:00的数据都到了。给他们入window。
这样实际是一个延时处理,等到了06:01:00时,我才开始将06:00:00的数据放入窗口。
如果很不巧,06:00:00的数据在06:01:00之后,lag为60s,不好意思,进不了窗口。此数据不会被处理,并且会在worker的日志中加一行INFO信息。
public class SlidingWindowBolt extends BaseWindowedBolt {
private OutputCollector collector;
@Override
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
}
@Override
public void execute(TupleWindow inputWindow) {
for(Tuple tuple: inputWindow.get()) {
// do the windowing computation
...
}
// emit the results
collector.emit(new Values(computedValue));
}
}
public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 1);
builder.setBolt("slidingwindowbolt",
new SlidingWindowBolt().withWindow(new Count(30), new Count(10)),
1).shuffleGrouping("spout");
Config conf = new Config();
conf.setDebug(true);
conf.setNumWorkers(1);
StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
}
Storm Windowing storm滑动窗口简介的更多相关文章
- TCP超时重传、序列号、滑动窗口简介
文章目录 12 TCP:传输控制协议(初步) 12.1 引言 12.1.1 ARQ和重传 12.1.2 分组窗口和滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 变量窗口:设置重传 ...
- storm 1.0版本滑动窗口的实现及原理
滑动窗口在监控和统计应用的场景比较广泛,比如每隔一段时间(10s)统计最近30s的请求量或者异常次数,根据请求或者异常次数采取相应措施.在storm1.0版本之前,没有提供关于滑动窗口的实现,需要开发 ...
- Storm 实现滑动窗口计数和TopN排序
计算top N words的topology, 用于比如trending topics or trending images on Twitter. 实现了滑动窗口计数和TopN排序, 比较有意思, ...
- storm滑动窗口
Window滑动方式: 没有数据不滑动windowLength:窗口的时间长度/tuple个数slidingInterval:滑动的时间间隔/tuple个数 withWindow(Duration w ...
- TCP 滑动窗口的简介
TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...
- Spark-Streaming之window滑动窗口应用
Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被 ...
- 57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例
一.window滑动窗口 1.概述 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据, 会被聚合起来执行计算操作 ...
- Sentinel滑动窗口算法
在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...
- 滑动窗口法——Leetcode例题
滑动窗口法--Leetcode例题(连更未完结) 1. 方法简介 滑动窗口法可以理解为一种特殊的双指针法,通常用来解决数组和字符串连续几个元素满足特殊性质问题(对于字符串来说就是子串).滑动窗口法的显 ...
随机推荐
- 字符串作为map的key
#include <map> #include <string> struct cmp_str{ bool operator()(char const* a, char con ...
- Git使用小记
刚刚简答的完成了pureblog,想着先上传导Github上去,等着以后有时间了在完善其功能,所以使用Git上传导Github代码仓库上去,这里简答的记录以下使用小计. 我们首先下载Git,我们使用用 ...
- Django基础,Day3 - 编写 django admin
Django 自带了一个简易编辑后台,可以称为"内容发布器",一般是提供给站点管理员使用的,其最开始也是开发出来提供给报社编辑和发布新闻使用的. 创建超级管理员: $ python ...
- ORA-00600: 内部错误代码
运行时报ORA-00600: 内部错误代码, 参数:[qcsgpvc3],[],[],[],[],[],[],[],[],[],[],[] ,上网搜了但大多数都不行.无心插柳柳成荫,就在无奈想要 ...
- 记录分享公司Spring data相关配置
起因 公司Spring Data相关的配置还是有点意思的,不过蛮复杂的...XML很多...我不太喜欢强行记住....所以我打算记录一下配置的大致思路和结构,以后可能会有用.... 总体结构 总体结构 ...
- ASP.MVC 基于AuthorizeAttribute权限设计案例
ASP.MVC上实现权限控制的方法很多,比如使用AuthorizeAttribute这个特性 1.创建自定义特性用于权限验证 public class AuthorizeDiy : Authorize ...
- 分析oracle的执行计划(explain plan)并对对sql进行优化实践
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...
- [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- java的锁机制
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...
- Cheat sheets