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来划分窗口:

  1. Tuple落入到哪个窗口,是看tuple里的Event time。
  2. 窗口向后推进,主要依靠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滑动窗口简介的更多相关文章

  1. TCP超时重传、序列号、滑动窗口简介

    文章目录 12 TCP:传输控制协议(初步) 12.1 引言 12.1.1 ARQ和重传 12.1.2 分组窗口和滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 变量窗口:设置重传 ...

  2. storm 1.0版本滑动窗口的实现及原理

    滑动窗口在监控和统计应用的场景比较广泛,比如每隔一段时间(10s)统计最近30s的请求量或者异常次数,根据请求或者异常次数采取相应措施.在storm1.0版本之前,没有提供关于滑动窗口的实现,需要开发 ...

  3. Storm 实现滑动窗口计数和TopN排序

    计算top N words的topology, 用于比如trending topics or trending images on Twitter. 实现了滑动窗口计数和TopN排序, 比较有意思,  ...

  4. storm滑动窗口

    Window滑动方式: 没有数据不滑动windowLength:窗口的时间长度/tuple个数slidingInterval:滑动的时间间隔/tuple个数 withWindow(Duration w ...

  5. TCP 滑动窗口的简介

    TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...

  6. Spark-Streaming之window滑动窗口应用

    Spark-Streaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据,会被 ...

  7. 57、Spark Streaming: window滑动窗口以及热点搜索词滑动统计案例

    一.window滑动窗口 1.概述 Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作.每次掉落在窗口内的RDD的数据, 会被聚合起来执行计算操作 ...

  8. Sentinel滑动窗口算法

    在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...

  9. 滑动窗口法——Leetcode例题

    滑动窗口法--Leetcode例题(连更未完结) 1. 方法简介 滑动窗口法可以理解为一种特殊的双指针法,通常用来解决数组和字符串连续几个元素满足特殊性质问题(对于字符串来说就是子串).滑动窗口法的显 ...

随机推荐

  1. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  2. C#大数据文本高效去重

    C#大数据文本高效去重 转载请注明出处 http://www.cnblogs.com/Huerye/ TextReader reader = File.OpenText(@"C:\Users ...

  3. 20155217-杨笛-c与java

    命是弱者的借口,运是强者的谦词 你有什么技能比大多数人(超过90%以上)更好? 针对这个技能的获取你有什么成功的经验? 与老师博客中的学习经验有什么共同之处? 其实我经常会去想自己有什么拿得出手的优点 ...

  4. shell 计算

    1.整数计算 n=$((/)) echo $n 输出 2(注意必须是两个括号) exper / / 注意这里不支持括号,a%b,a/b后取余 output: 1 2.小数计算 bc <<& ...

  5. codevs2216 行星序列

    题目描述 Description "神州"载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了"小小宇航员夏令营",在这里小 ...

  6. Android Textview实现文字颜色渐变效果

    最近做应用的时候遇到一个需求,一行文字的颜色需要一个渐变效果 如上所有 从左到有逐渐变化,自己写了一个demo实现上述效果 package com.huwei.example.test; import ...

  7. Greenplum-概念篇

    Greenplum主要组件包括:Master.Segments.Interconnect:其他组件包括ETL Server.Greenplum command center等.0. 组件之-Maste ...

  8. 释放修改OS X 10.11系统文件权限【转】

    序言:有时要替换相关的(系统目录下的)文件以完成软件的破解,但在 OS X 10.11 系统图形界面下,Root(系统超级用户)已‘转变’为 Administrator(管理员用户),选择系统文件夹( ...

  9. 带参方法的执行:普通方法的查询,可为空方法的查询。批量处理SQL语句。

    普通方法的查询: @Override public List<Map<String, Object>> selectSpentAmount(Integer MAT_TYPE_, ...

  10. react+redux官方实例TODO从最简单的入门(2)-- 增

    虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...