news 2026/2/10 6:43:41

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/2/6 4:22:54

RK3588 YOLOv5 Android 实战解析:NPU 量化部署、多线程推理与目标跟踪全流程开源

文章目录 一、项目概述与目标 为什么选择RK3588? 二、开发环境准备 硬件与软件配置 项目源码获取 三、快速上手:编译与运行 项目目录结构解析 一键运行 四、系统架构深度解析 核心挑战与解决方案 1. 相机集成挑战 2. 并发处理难题 3. 图像格式转换 4. 数据缓存管理 系统整体架…

作者头像 李华
网站建设 2026/2/5 18:08:52

小程序flask连锁火锅智慧餐饮管理系统 聊天 餐厅 供应商

目录系统架构与功能模块技术实现亮点商业价值体现开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统架构与功能模块 Flask连锁火锅智慧餐饮管理系统采用轻量级Python框架Flask构建后端&am…

作者头像 李华
网站建设 2026/2/7 4:54:53

Agent架构新趋势:从模型能力到系统判断,收藏级深度解析判断工程化

文章指出Agent技术正从关注模型能力转向系统判断工程化。随着系统复杂度增加&#xff0c;将本应结构化的判断交给模型即时完成会导致不可预测性。Claude Skills等方案通过将验证过的能力从prompt中提取为可管理组件&#xff0c;解决这一挑战。未来Agent系统应更关注判断正确性而…

作者头像 李华
网站建设 2026/2/7 17:38:47

加密界懒人福音!OEMexe,无原程序也能解密

试过不少加密工具&#xff0c;要么操作繁琐&#xff0c;要么解密必须依赖原软件&#xff0c;换台电脑就抓瞎&#xff0c;真心折腾。 直到发现OEMexe这款神仙工具&#xff0c;直接刷新我对加密软件的认知&#xff0c;用一次就彻底爱上。它的操作简单到离谱&#xff1a;打开软件…

作者头像 李华