Storm Window机制详解

Storm滑动窗口实现批量计算 storm是一个流式处理框架,可以做到Spout产生一条数据,Bolt处理一条以达到实时计算。 这种模式并不是实际的业务需要的,我们更多是需要 最近5分钟的PV UV ,最近10分钟的网络最大延迟,最近5分钟页面访问TOP10 这类问题都可以抽象为:每隔M秒统计最近N秒内的数据,即我们需要一个滑动窗口(固定时间段)来控制数据流量 因为storm 未提供api封装,滑动窗口只能自己来实现 阅读详情

概念

window 类型

Tumbling Window

按照固定的时间间隔或者Tuple数量划分窗口。

例子一,按照固定时间滚动,5秒滚一个窗口:

| e1 e2 | e3 e4 e5 e6 | e7 e8 e9 |...
0       5             10         15    -> time
|   w1  |    w2       |     w3   |...

例子二,按照固定Tuple数量滚动,5个Tuple滚一个窗口

| e1 e2 e3 e4 e5 | e6 e7 e8 e9 e10 |...
0              5                10    -> count
|       w1       |        w2       |...
Sliding Window

也可以根据时间间隔或者Tuple数量来划分窗口,由于窗口长度也可以是时间或者Tuple数量,所以Sliding Window的形式比Tumbling Window多

例子一,窗口长度为10s,滑动间隔为5s

| e1 e2 | e3 e4 e5 e6 | e7 e8 e9 |...
0       5             10         15    -> time
w1----->|
|----------w2---------|
        |-----------w3-----------|

例子二,窗口长度为10s,滑动间隔为5个Tuple

| e1 e2 e3 e4 e5 | e6 e7 e8 e9 e10 | e11 ...
0             5                10       -> count
|-------w1------|
         |----------w2------------|

例子三,窗口长度为10个Tuple,滑动间隔为5个Tuple

| e1 e2 e3 e4 e5 | e6 e7 e8 e9 e10 | e11 e12 e13 e14 e15 | ...
0              5                 10                    15  -> count
|-------w1-------|
|-----------------w2---------------|
                 |-------------------w2-----------------|

例子四,窗口长度为10个Tuplp,滑动间隔为5s

| e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12 e13 e14 e15 ...
0                      5             10           15   -> time
|------------w1---------|
        |--------------w2--------------|

当窗口长度和滑动距离相等时,便成了滚动窗口

TriggerPolicy

窗口的触发策略,用于确定窗口的计算点,以时间或者Tuplt数量为标准

EvictionPolicy

窗口的事件回收策略,用标记的方式确定事件是否属于本次窗口

Watermark和Lag

Watermark用于标记数据的处理进度,Lag主要是应对数据乱序的情况。

从当前数据中的最新一条数据的时间算起,往前减去Lag,得到一个时间,这个时间成为Watermark,认为Watermark之前的数据都已经到了。

06:00:00的数据有可能在06:00:06之后才到,若Lag=5s,不好意思,进不了窗口,会被 当成超时的数据。

代码分析

EvictionPolicy

事件回收策略接口,目前有4种实现,用于将event标记为以下4个状态:

EXPIRE:失效的事件,会从queue中移除
PROCESS:将在最近的一个window中处理事件
KEEP:将在以后的window中处理些事件
STOP:停止处理些事件之后的event,认为此event之后的event将不再满足这个策略

接口代码如下:

public interface EvictionPolicy<T> { 
    enum Action {
       EXPIRE,PROCESS,KEEP,STOP
    }
    Action evict(Event<T> event);  //对事件进行标记
    void track(Event<T> event);  //对事件进行跟踪
    void setContext(EvictionContext context);  //设置context
}

分别介绍4种EvictionPolicy的实现类。

CountEvictionPolicy

以event数量做为窗口长度,只会标记两种状态:EXPIRE和PROCESS,有track()和evict()两个主要方法。

track方法如下,用成员变量currentCount记录已经跟踪的event数据,但并不包括watermark event。

@Override
public void track(Event<T> event) {
    if (!event.isWatermark()) {
        currentCount.incrementAndGet();
    }
}

evict方法如下,返回一个标记后的Action,成员变量threshold即为窗口长度,当currentCount的值大于threshold时,则表示此事件不在本次窗口处理之内,需要标记为EXPIRE,否则标记为PROCESS。

@Override
public Action evict(Event<T> event) {
    while (true) {
        long curVal = currentCount.get();
        if (curVal > threshold) {
            if (currentCount.compareAndSet(curVal, curVal - 1)) {
                return Action.EXPIRE;
            }
        } else {
            break;
        }
    }
    return Action.PROCESS;
}
WatermarkCountEvictionPolicy

继承自CountEvictionPolicy,增加referenceTime和processed两个私有成员变量

referenceTime:即watermark(后面有解释)
processed:本次窗口中已经被标记为PROCESS状态的event数量

WatermarkCountEvictionPolicy比CountEvictionPolicy多了一个KEEP状态,被标记为KEEP状态的event将在下一个窗口中处理。

track()方法实现为空

evict的实现如下

@Override
public Action evict(Event<T> event) {
    Action action;
    if (event.getTimestamp() <= referenceTime && processed < currentCount.get()) {
        action = super.evict(event);
        if (action == Action.PROCESS) {
            ++processed;
        }
    } else {
        action = Action.KEEP;
    }
    return action;
}
TimeEvictionPolicy

以时间做为窗口的长度,只会标记两种状态:EXPIRE和PROCESS,用事件的时间和最新的时间做为标记的依据

track方法实现为空

evicty方法如下,成员变量referenceTime可能是在window中计算而来,或者是系统当前时间,

public Action evict(Event<T> event) {
    long now = referenceTime == null ? System.currentTimeMillis() : referenceTime;
    long diff = now - event.getTimestamp();
    if (diff >= windowLength) {
        return Action.EXPIRE;
    }
    return Action.PROCESS;
}
WatermarkTimeEvictionPolicy

WatermarkTimeEvictionPolicy继承自TimeEvictionPolicy,增加了成员变量lag,标记的状态也比TimeEvictionPolicy多了STOP和KEEP

重写了evict方法

1   public Action evict(Event<T> event) {
2       long diff = referenceTime - event.getTimestamp();
3       if (diff < -lag) {
4           return Action.STOP; 
5       } else if (diff < 0) {
6           return Action.KEEP;
7       } else {
8           return super.evict(event);
9       }
10  }

第3行的判断可以理解为event的时间比referenceTime大了一个lag以上,在此标记为STOP,后面的scan方法将在此处停止,认为后面的event都不可能在本次窗口事件中处理

第5行的判断为event的时间比referenceTime大了一个lag以内,标记为KEEP。

TriggerPolicy

window的触发策略接口,满足触发条件时,WindowManager的onTrigger方法得以执行。接口代码如下:

public interface TriggerPolicy<T> {
    void track(Event<T> event);  //跟踪每个event,看是否满足触发条件
    void reset();
    void start();
    void shutdown();
}

也有4个实现类

CountTriggerPolicy

track方法如下,很简单,当跟踪的event数据大于count时,触发onTrigger,count为构造方法传的触发上限。

public void track(Event<T> event) {
    if (started && !event.isWatermark()) {
        if (currentCount.incrementAndGet() >= count) {
            evictionPolicy.setContext(new DefaultEvictionContext(System.currentTimeMillis()));
            handler.onTrigger();
        }
    }
}
WatermarkCountTriggerPolicy

直接实现TriggerPolicy,而不是继承CountTriggerPolicy。由于watermark event来触发onTrigger

track方法如下:

public void track(Event<T> event) {
    if (started && event.isWatermark()) {
        handleWaterMarkEvent(event);
    }
}
private void handleWaterMarkEvent(Event<T> waterMarkEvent) {
    long watermarkTs = waterMarkEvent.getTimestamp();
    List<Long> eventTs = windowManager.getSlidingCountTimestamps(lastProcessedTs, watermarkTs, count);
    for (long ts : eventTs) {
        evictionPolicy.setContext(new DefaultEvictionContext(ts, null, Long.valueOf(count)));
        handler.onTrigger();
        lastProcessedTs = ts;
    }
}
TimeTriggerPolicy

定时来触发窗口的计算。这个实现中用会启动一个ScheduledExecutorService定时器,周期性执行内部线程newTriggerTask,由newTriggerTask来调用onTrigger方法。(代码很简单,就不贴啦)

WatermarkTimeTriggerPolicy

这个类也是直接实现了TriggerPolicy接口,在track方法中判断事件是否是watermark event,来决定是否触发窗口计算。
track方法如下:

public void track(Event<T> event) {
    if (started && event.isWatermark()) {
        handleWaterMarkEvent(event);
    }
}

handleWaterMarkEvent方法通过while偱环,windowEndTs是当然计算的窗口的终点,起点就是终点减去窗口长度,本次窗口计算结束,onTrigger如果返回为true,windowEndTs将加上一个slidingIntervalMs(滑动长度)做为下一个窗口的终点。onTrigger如果返回为false,则表示这次计算的窗口中没有event,将通过getNextAlignedWindowT方法来找到下一个窗口的终点。

private void handleWaterMarkEvent(Event<T> event) {
    long watermarkTs = event.getTimestamp();
    long windowEndTs = nextWindowEndTs;
    LOG.debug("Window end ts {} Watermark ts {}", windowEndTs, watermarkTs);
    while (windowEndTs <= watermarkTs) {
        long currentCount = windowManager.getEventCount(windowEndTs);
        evictionPolicy.setContext(new DefaultEvictionContext(windowEndTs, currentCount));
        if (handler.onTrigger()) {
            windowEndTs += slidingIntervalMs;
        } else {
            /*
             * 如果上次onTrigger没有event,将通过getNextAlignedWindowTs方法来找到下一个窗口
             */
            long ts = getNextAlignedWindowTs(windowEndTs, watermarkTs);
            LOG.debug("Next aligned window end ts {}", ts);
            if (ts == Long.MAX_VALUE) {
                LOG.debug("No events to process between {} and watermark ts {}", windowEndTs, watermarkTs);
                break;
            }
            windowEndTs = ts;
        }
    }
    nextWindowEndTs = windowEndTs;
}

getNextAlignedWindowT方法通过找到windowEndTs到watermark这段时间里最早的一个event的时间戳,以nextTs + (slidingIntervalMs - (nextTs % slidingIntervalMs))的方式做时间对齐,找到小于最早时间戳里,能被滑动间隔整除的最小的一个时间点,做为下次计算的窗口的终点。

private long getNextAlignedWindowTs(long startTs, long endTs) {
    long nextTs = windowManager.getEarliestEventTs(startTs, endTs);
    if (nextTs == Long.MAX_VALUE || (nextTs % slidingIntervalMs == 0)) {
        return nextTs;
    }
    return nextTs + (slidingIntervalMs - (nextTs % slidingIntervalMs));
}

通过EvictionPolicy和TriggerPolicy这两个接口的组合,形成了前面所讲的6个窗口类型。这两个接口的实现类中,也可以分为带watermark的类和不带watermark的类,如果用户设置了时间字段,就会以带watermark的类处理event.

WaterMark的计算

在api中使用以下方法来改变watermark的产生周期,默认值是1000ms

public BaseWindowedBolt withWatermarkInterval(Duration interval)

interval实际被设置到了WaterMarkEventGenerator中,WaterMarkEventGenerator是一个线程,每隔interval时间间隔被ScheduledExecutorService执行一次,看以下WaterMarkEventGenerator中的几个关键方法。

track

/**
* Tracks the timestamp of the event in the stream, returns
* true if the event can be considered for processing or
* false if its a late event.
* track在WindowedBoltExecutor的execute方法中被调用,以(ts >= lastWaterMarkTs)来判断事件是否应该被放到queue中
*/

public boolean track(GlobalStreamId stream, long ts) {
    Long currentVal = streamToTs.get(stream);
    if (currentVal == null || ts > currentVal) {
        streamToTs.put(stream, ts);             //更新streamid对应的时间戳
    }
    checkFailures();
    return ts >= lastWaterMarkTs;             
}

computeWaterMarkTs

/**
*计算新的watermark,watermark是所有输入流中最新的tuple时间戳的最小值(减去延时)
*/
private long computeWaterMarkTs() {
    long ts = 0;
    // only if some data has arrived on each input stream
    if (streamToTs.size() >= inputStreams.size()) {
        ts = Long.MAX_VALUE;
        for (Map.Entry<GlobalStreamId, Long> entry : streamToTs.entrySet()) {
            ts = Math.min(ts, entry.getValue());
        }
    }
    return ts - eventTsLag;
}

Example

(来自于官网)

若基于以下参数和数据:

Window length = 20s, sliding interval = 10s, watermark emit frequency = 1s, max lag = 5s

当前时间 = 09:00:00

Tuples e1(6:00:03), e2(6:00:05), e3(6:00:07), e4(6:00:18), e5(6:00:26), e6(6:00:36) 在 9:00:00 and 9:00:01之前到达

在 09:00:01产生了新的 watermark, w1 = 6:00:31 ,此时,早于 6:00:31 的event到达时,将被当成超时数据。

通过事件中最早的一个 timestamp (06:00:03)和sliding interval来计算后,将产生三个window,第一个window的终点是06:00:10,如下所示:

  1. 5:59:50 - 06:00:10 : e1, e2, e3
  2. 6:00:00 - 06:00:20 : e1, e2, e3, e4
  3. 6:00:10 - 06:00:30 : e4, e5

由于e6(6:00:36) 比watermark(6:00:31)要晚,所以不在本次触发中处理。

Tuples e7(8:00:25), e8(8:00:26), e9(8:00:27), e10(8:00:39) 在 9:00:01 and 9:00:02之间到达

在 09:00:02 产生下一个 watermark, w2 = 08:00:34 ,此时,早于 8:00:34 的event到达时,将被当成超时数据。

将产生以下window:

  1. 6:00:20 - 06:00:40 : e5, e6
  2. 6:00:30 - 06:00:50 : e6
  3. 8:00:10 - 08:00:30 : e7, e8, e9

e10 (8:00:39 )比 watermark 8:00:34 晚,所以不在本次处理

其它

第一个窗口怎么产生

进程启动初次触发窗口计算时,WindowManager的onTrigger()方法会返回false,WatermarkTimeTriggerPolicy中的getNextAlignedWindowTs()方法会被调用,从而产生第一个真正的Window。

之后每次触发窗口计算,会用上一次计算的最后一个窗口的结束时间加上sliding interval得到本次计算的下一个窗口的结束时间。

Guarantees

storm window提供了at-least once的保障,tuple在window中经过 windowLength + slidingInterval后被expire后,然后自动被ack,因此topology.message.timeout.secs 必须远大于 windowLength + slidingInterval 。如果是基于count触发的window,需要去结合实际的窗口长度和滑动时间才调整超时时间的大小。

DSPy+STORM构建可编程多步推理系统实战指南 大语言模型应用正从简单提示工程迈向结构化、可调试的多步推理范式。STORM作为一种显式建模信息检索、大纲生成、初稿撰写、事实核验与终稿整合的推理协议,结合DSPy声明式编程框架,实现了LLM调用的模块化、接口化与自动优化。该技术组合不依赖闭源API,支持本地小模型(如Mistral-7B)在有限显存下稳定运行复杂认知流水线,显著提升RAG结果的可信度与可维护性。其核心价值在于将模糊的‘智能行为’拆解为可测量、可替换、可版本控制的原子操作,适用于知识密集型问答、企业级智能助手及可控AI研究系统构建。 阅读详情

相关推荐

Storm-Windowing-Analysis:这个 Repository 有零碎的部分,当然是代码,从分析到在 STORM 中实现窗口机制

风暴窗口分析 这个 Repository 有零碎的部分,当然是代码,从分析到在 STORM 中实现窗口机制

storm windows 机制

一. Window是什么 在流式处理框架中, window的概念并非Storm独有,例如Flink中也有相同的概念,可以参考博文流处理中的Window概念来帮助理解,看完前面图文部分应该可以理解Window的含义以及作用。本小白拙见:Window就像一个监视器,可以在满足某些条件时对流入Window中的tuple做出相应的处理。目前,Storm只支持两种触发Window进行操作的条件,即经过一个...

lsh009的专栏 434

AGM Supra软件从零到一:国产CPLD工程创建全流程实战解析

本文详细解析了AGM Supra软件在国产CPLD开发中的全流程实战操作,从工程创建到代码开发、编译调试,再到高级技巧与疑难排解。特别对比了Supra与Quartus的差异,提供了工程路径管理、Quartus项目转换、HDL代码规范等实用技巧,帮助开发者高效完成CPLD项目开发。

weixin_29193259的博客 502

Storm的窗口操作

Storm可同时处理窗口内的所有tuple。窗口可以从时间或数量上来划分,由如下两个因素决定: 窗口的长度(windowLength),可以是时间间隔或Tuple数量; 滑动间隔(sliding Interval),可以是时间间隔或Tuple数量; ※要确保topology的过期时间大于窗口的大小加上滑动间隔 Sliding Window:滑动窗口 按照固定的时间间隔或者Tuple数量滑

Zonzereal的博客 5964

STM32与威纶通触摸屏RS485通信实战:Modbus RTU协议与避坑指南

在工业自动化与嵌入式系统开发中,串行通信是实现设备间数据交换的基础技术。RS485总线凭借其差分信号传输、抗干扰能力强、支持多点通信及长距离传输等特性,成为工业现场广泛应用的物理层标准。其核心原理是利用一对双绞线进行平衡传输,有效抑制共模噪声。在协议层,Modbus RTU作为开放、简洁的主从式应用层协议,定义了统一的数据模型(如线圈、寄存器)和功能码,极大简化了不同厂商设备间的互操作性。结合STM32微控制器的UART外设与威纶通(Weinview)人机界面(HMI),可以构建稳定可靠的监控与控制系统。本

weixin_33925615的博客 329

LabVIew串口收发的一些问题

LabView串口收发实验总结

weixin_45508826的博客 2065

Storm窗口机制

storm可同时处理窗口内的所有tuple。可以从时间或数量上来对窗口进行划分,窗口由如下两个因素决定: 窗口的长度,可以是时间或Tuple数量; 滑动间隔(sliding Interval),同样也可以是时间或Tuple数量,后面Sliding Window中介绍;

石权的博客 6619

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码)

本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。

weixin_42571738的博客 186

Storm中的Window机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33719619的博客 329

【局部规划模块轨迹优化算法】EM_planner最大期望滚动优化算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对EM_planner最大期望滚动优化算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 760

基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】

基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】---来自一位即将入学的准研一,也希望这篇文章能够激励自己不断走下去!!

qq_46044325的博客 4442

基于storm的Window

Watermark作用 在解释storm的window之前先说明一下watermark原理。 Watermark中文翻译为水位线更为恰当。 顺序的数据从源头开始发送到到操作,中间过程肯定会出现数据乱序情况,比如网络原因,数据并发发送等。如何区分乱序的数据和正常的数据,就引申出了watermark。 Watermark是每一个时间窗口的下限,意思是说当watermark大于了窗口截止时间,那

aa3214567的博客 419

芒果YOLOv5改进107:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea

包括YOLOv5、YOLOv7、YOLOv8等模型改进 956

storm中如何使用BaseWindowedBolt的ack机制

最近有个需求,在WindowedBolt中需要对每个tuple进行ack,如果异常则进行fail,如是,我按照普通Bolt的写法,却始终实现不了上面的功能,代码如下: List<Tuple> tupleList = inputWindow.get(); try { if (tupleList.isEmpty()) { ...

牛奋lch 1975

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 987

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

storm 批处理以及TickTuple窗口

一、Storm Storm是一个实时的可靠地分布式流计算框架。一个典型的大数据实时计算应用场景:从Kafka消息队列读取消息(可以是logs,clicks,sensor data);通过Storm对消息进行计算聚合等预处理;把处理结果持久化到数据库或者HDFS做进一步深入分析。 Storm中分为Topology开发和Trident开发,Trident是一种高度抽象的实时计算模型,是一种有...

微溪 1508

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

storm(一) window机制

Watermark作用 在解释storm的window之前先说明一下watermark原理。 Watermark中文翻译为水位线更为恰当。 顺序的数据从源头开始发送到到操作,中间过程肯定会出现数据乱序情况,比如网络原因,数据并发发送等。如何区分乱序的数据和正常的数据,就引申出了watermark。 Watermark是每一个时间窗口的下限,意思是说当watermark大于了窗口截止时间,那...

weixin_34268843的博客 99

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Storm 和 SparkStreaming区别

<div id="post_detail" class="cye-lm-tag"> Spark_总结五  转载请标明出处http://www.cnblogs.com/haozhengfei/p/e353daff460b01a5be13688fe1f8c952.html  Spark_总结五 1.Stor...

斧王,不能再斩杀了吗的博客 229

Flink及Storm、Spark流框架比较

流框架基于的实现方式分为两大类。 第一类是Native Streaming,这类引擎中所有的data在到来的时候就会被立即处理,一条接着一条(HINT: 狭隘的来说是一条接着一条,但流引擎有时会为提高性能缓存一小部分data然后一次性处理),其中的代表就是storm和flink。 第二种则是基于Micro-batch,数据流被切分为一个一个小的批次, 然后再逐个被引擎处理。这些batch一般是...

redfivehit的专栏 797

聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public void prepare(Map stormConf, Topolo...

weixin_33860722的博客 98

Apache Storm实时计算框架核心原理与调优实践

实时计算作为大数据处理的关键技术,通过流式处理模型实现毫秒级延迟的数据分析。其核心原理基于分布式架构和消息传递机制,采用主从式设计确保高可用性,通过有向无环图(DAG)组织数据处理流程。在技术价值层面,实时计算框架相比批处理能更快响应业务变化,特别适合金融风控、物联网数据处理等时效性敏感场景。Apache Storm作为代表性开源框架,通过独特的ACK机制保障消息可靠性,支持Kafka等消息队列深度集成。在工程实践中,合理的并发度设置、序列化优化和资源监控是提升吞吐量的关键,典型应用包括电商实时统计和在线推

weixin_33806300的博客 512

storm 批处理(窗口)

storm 批处理(窗口) 一、Storm Storm是一个实时的可靠地分布式流计算框架。一个典型的大数据实时计算应用场景:从Kafka消息队列读取消息(可以是logs,clicks,sensor data);通过Storm对消息进行计算聚合等预处理;把处理结果持久化到数据库或者HDFS做进一步深入分析。 Storm中分为Topology开发和Trident开发,Trident是一种高度抽象的实...

大JAVA解决方案 536

流式计算的代表:Storm、Flink、Spark Streaming

我前面介绍的大数据技术主要是处理、计算存储介质上的大规模数据,这类计算也叫大数据批处理计算。顾名思义,数据是以批为单位进行计算,比如一天的访问日志、历史上所有的订单数据等。这些数据通常通过HDFS存储在磁盘上,使用MapReduce或者Spark这样的批处理大数据计算框架进行计算,一般完成一次计算需要花费几分钟到几小时的时间。此外,还有一种大数据技术,针对实时产生的大规模数据进行即时计算处理,我们比较熟悉的有摄像头采集的实时视频数据、淘宝实时产生的订单数据等。

qq_33240556的博客 1159

Storm时间窗口

目录(1)时间窗口概念(1)滚动窗口 Tumbling Window(2)滑动窗口 Tumbling Window(2)滚动窗口程序开发及测试(2)滑动窗口程序开发及测试 (1)时间窗口概念 什么是时间窗口? 按一定的时间或者tuple数量来定义打包处理的大小称之为时间窗口。 使用场景: 计算每隔10分钟的销售额。 计算上1分钟成交金额 计算近1个小时最火爆的微博等。 Storm的时间窗口机制 Storm可同时处理窗口内的所有tuple。窗口可以从时间或数量上来划分,就是说可以根据时间段或 Tuple数

蔡政洁的博客 772
上一篇: Trident exactly once实现原理
下一篇: 认识bash shell
vim_wj
博客等级 码龄12年 12粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值