news 2026/5/28 19:58:02

Apache Flink 窗口处理函数全解析(增量 + 全量 + 混合)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Flink 窗口处理函数全解析(增量 + 全量 + 混合)

Flink 窗口(Window) 是处理无界流数据时最核心的概念之一,它能将无限制的数据流按时间或数量切分成一个个有限的“数据桶”,然后在这些“桶”里执行聚合计算。


一、什么是窗口处理函数

Flink 窗口处理函数定义了窗口内数据如何被计算与输出。根据处理时机不同,可以分为:

类型是否缓存窗口内所有数据优点典型函数
增量处理低延迟、节省空间reduceaggregate
全量处理可访问全窗口数据applyprocess

二、增量处理 — 每条数据来就处理

🔹 reduce

  • 每条数据到达都会更新聚合结果
  • 输入 / 累加器 / 输出类型一致
  • 不保存整个窗口数据,只累加状态
.reduce(newReduceFunction<SensorReading>(){@OverridepublicSensorReadingreduce(SensorReadinga,SensorReadingb){// 计算最大温度returna.getTemperature()>b.getTemperature()?a:b;}})

⚠ 如果窗口只有一条数据,reduce()不会被调用。


🔹 aggregate

更灵活的累加处理:

✔ 输入类型、累加器类型、输出类型可以不一致
✔ 可在累加器中做更复杂逻辑

核心方法:

  • createAccumulator():初始化累加器
  • add():每条记录到达调用
  • getResult():窗口触发时返回结果
  • merge():会话窗口需要合并状态

三、全量处理 — 等窗口触发再处理

不同于增量处理,全量处理保留整个窗口数据,并在窗口结束时一次性计算:

🔹 apply

适合窗口中数据量不是特别大但需要全量访问的场景。

.apply(newWindowFunction<...>(){@Overridepublicvoidapply(...){// 访问完整窗口数据操作}});

🔹 process

最底层的全量处理函数,可以获取更多上下文信息,如窗口时间、watermark、状态等:

.process(newProcessWindowFunction<SensorReading,String,String,TimeWindow>(){@Overridepublicvoidprocess(Stringkey,Contextcontext,Iterable<SensorReading>elements,Collector<String>out){// 访问窗口全部元素}});

这个函数比apply更强大。


四、为什么这些很重要?

  • 大部分真实业务中,我们既希望结果准确(全量处理),又希望响应快(增量处理)。
  • 通过增量处理先减少延迟,再用全量处理做更精细计算,可以在性能和准确性间取得平衡。

五、传感器温度实时窗口统计

事件模型 —SensorReading

publicclassSensorReading{privateStringsensorId;privateLongtimestamp;privateDoubletemperature;publicSensorReading(){}publicSensorReading(StringsensorId,Longtimestamp,Doubletemperature){this.sensorId=sensorId;this.timestamp=timestamp;this.temperature=temperature;}// getter / setter@OverridepublicStringtoString(){return"SensorReading{"+"sensorId='"+sensorId+'\''+", timestamp="+timestamp+", temperature="+temperature+'}';}}

🔹 5.2 自定义模拟数据源 — SensorSource

publicclassSensorSourceimplementsSourceFunction<SensorReading>{privatevolatilebooleanrunning=true;@Overridepublicvoidrun(SourceContext<SensorReading>ctx)throwsException{Randomrand=newRandom();while(running){longtimestamp=System.currentTimeMillis();// 5 个 sensor 并行发送for(inti=0;i<5;i++){StringsensorId="sensor_"+i;doubletemp=20+rand.nextGaussian()*10;ctx.collect(newSensorReading(sensorId,timestamp,temp));}Thread.sleep(200);}}@Overridepublicvoidcancel(){running=false;}}

主程序 — 引入 Watermark + 多种窗口处理

publicclassFlinkWindowDemo{publicstaticvoidmain(String[]args)throwsException{StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();DataStream<SensorReading>stream=env.addSource(newSensorSource()).assignTimestampsAndWatermarks(WatermarkStrategy.<SensorReading>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner((event,ts)->event.getTimestamp()));// —— 增量处理:reducestream.keyBy(SensorReading::getSensorId).window(TumblingEventTimeWindows.of(Duration.ofSeconds(10))).reduce((a,b)->a.getTemperature()>b.getTemperature()?a:b).print("Reduce Max Temp");// —— 全量处理:processstream.keyBy(SensorReading::getSensorId).window(TumblingEventTimeWindows.of(Duration.ofSeconds(10))).process(newProcessWindowFunction<SensorReading,String,String,TimeWindow>(){@Overridepublicvoidprocess(Stringkey,Contextctx,Iterable<SensorReading>elements,Collector<String>out){intcount=0;doublesum=0;for(SensorReadingr:elements){count++;sum+=r.getTemperature();}out.collect(key+" avg="+(sum/count)+", count="+count);}}).print("Process Avg Temp");env.execute("Flink Window Demo");}}

六、何时用哪种处理方式?

场景推荐
实时性要求高 & 只需简单汇总增量处理 (reduce,aggregate)
需要完整窗口统计全量处理 (process,apply)
又要快响应又要丰富输出混合模式

七、总结

✔ 增量处理 —— 快、少空间,但无法访问全部数据
✔ 全量处理 —— 能访问所有数据,结果丰富但占空间
✔ 混合模式 —— 最灵活、兼顾性能和业务需求

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 13:23:57

ISTA 3A与3E标准解析:医疗器械运输测试的关键意义

一、标准核心内容介绍ISTA 3A与3E均属于ISTA 3系列高级模拟测试标准&#xff0c;聚焦包装产品运输防护性能评估&#xff0c;但适用场景与测试要求存在显著差异。ISTA 3A标准针对单包运输的70kg&#xff08;150lb&#xff09;及以下包装产品&#xff0c;涵盖标准、小型、扁平、细…

作者头像 李华
网站建设 2026/5/27 7:01:04

RK3588 高分辨率多摄像头系统优化实战:48MP 单摄与双摄分时复用方案解析

文章目录 前言 一、RK3588摄像头硬件资源深度解析 1.1 MIPI PHY硬件架构 1.2 软件通路映射关系详解 1.3 关键配置要点 二、双ISP合成技术深度剖析 2.1 高分辨率处理的技术挑战 2.2 双ISP合成的系统配置 2.3 虚拟ISP节点的重要作用 三、48M分辨率单摄系统的完整实现 3.1 OV50C40…

作者头像 李华
网站建设 2026/5/22 18:37:44

大数据技术的基于Python+Selenium的招聘信息智能采集与分析系统开题任务书

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着互联网招聘信息的爆炸式增长&#xff0c;传统的人工采集与分析方式效率低下且难以满足精准化需求。基于大数据技术构建的招…

作者头像 李华
网站建设 2026/5/20 17:19:03

伺服电机十年演进

你问 伺服电机十年演进&#xff0c;其实已经不是在问 “转速更高、扭矩更大、效率更好”&#xff0c; 而是在问一个更底层的问题&#xff1a; 当机器人、自动驾驶、工业系统开始长期、无人、连续地“动”&#xff0c; 谁来保证“它的每一次力输出&#xff0c;都是被允许的”&am…

作者头像 李华