境外网站icp备案空间链接制作网站
2026/2/14 9:10:34 网站建设 项目流程
境外网站icp备案,空间链接制作网站,涂料网站建设,互联网怎么做网站Flink 窗口#xff08;Window#xff09; 是处理 无界流数据 时最核心的概念之一#xff0c;它能将无限制的数据流按 时间或数量 切分成一个个有限的“数据桶”#xff0c;然后在这些“桶”里执行聚合计算。一、什么是窗口处理函数 Flink 窗口处理函数定义了 窗口内数据如何…Flink 窗口Window 是处理无界流数据时最核心的概念之一它能将无限制的数据流按时间或数量切分成一个个有限的“数据桶”然后在这些“桶”里执行聚合计算。一、什么是窗口处理函数Flink 窗口处理函数定义了窗口内数据如何被计算与输出。根据处理时机不同可以分为类型是否缓存窗口内所有数据优点典型函数增量处理❌低延迟、节省空间reduce、aggregate全量处理✔可访问全窗口数据apply、process二、增量处理 — 每条数据来就处理 reduce每条数据到达都会更新聚合结果输入 / 累加器 / 输出类型一致不保存整个窗口数据只累加状态.reduce(newReduceFunctionSensorReading(){OverridepublicSensorReadingreduce(SensorReadinga,SensorReadingb){// 计算最大温度returna.getTemperature()b.getTemperature()?a:b;}})⚠ 如果窗口只有一条数据reduce()不会被调用。 aggregate更灵活的累加处理✔ 输入类型、累加器类型、输出类型可以不一致✔ 可在累加器中做更复杂逻辑核心方法createAccumulator()初始化累加器add()每条记录到达调用getResult()窗口触发时返回结果merge()会话窗口需要合并状态三、全量处理 — 等窗口触发再处理不同于增量处理全量处理保留整个窗口数据并在窗口结束时一次性计算 apply适合窗口中数据量不是特别大但需要全量访问的场景。.apply(newWindowFunction...(){Overridepublicvoidapply(...){// 访问完整窗口数据操作}}); process最底层的全量处理函数可以获取更多上下文信息如窗口时间、watermark、状态等.process(newProcessWindowFunctionSensorReading,String,String,TimeWindow(){Overridepublicvoidprocess(Stringkey,Contextcontext,IterableSensorReadingelements,CollectorStringout){// 访问窗口全部元素}});这个函数比apply更强大。四、为什么这些很重要在大部分真实业务中我们既希望结果准确全量处理又希望响应快增量处理。通过增量处理先减少延迟再用全量处理做更精细计算可以在性能和准确性间取得平衡。五、传感器温度实时窗口统计事件模型 —SensorReadingpublicclassSensorReading{privateStringsensorId;privateLongtimestamp;privateDoubletemperature;publicSensorReading(){}publicSensorReading(StringsensorId,Longtimestamp,Doubletemperature){this.sensorIdsensorId;this.timestamptimestamp;this.temperaturetemperature;}// getter / setterOverridepublicStringtoString(){returnSensorReading{sensorIdsensorId\, timestamptimestamp, temperaturetemperature};}} 5.2 自定义模拟数据源 — SensorSourcepublicclassSensorSourceimplementsSourceFunctionSensorReading{privatevolatilebooleanrunningtrue;Overridepublicvoidrun(SourceContextSensorReadingctx)throwsException{RandomrandnewRandom();while(running){longtimestampSystem.currentTimeMillis();// 5 个 sensor 并行发送for(inti0;i5;i){StringsensorIdsensor_i;doubletemp20rand.nextGaussian()*10;ctx.collect(newSensorReading(sensorId,timestamp,temp));}Thread.sleep(200);}}Overridepublicvoidcancel(){runningfalse;}}主程序 — 引入 Watermark 多种窗口处理publicclassFlinkWindowDemo{publicstaticvoidmain(String[]args)throwsException{StreamExecutionEnvironmentenvStreamExecutionEnvironment.getExecutionEnvironment();DataStreamSensorReadingstreamenv.addSource(newSensorSource()).assignTimestampsAndWatermarks(WatermarkStrategy.SensorReadingforBoundedOutOfOrderness(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(newProcessWindowFunctionSensorReading,String,String,TimeWindow(){Overridepublicvoidprocess(Stringkey,Contextctx,IterableSensorReadingelements,CollectorStringout){intcount0;doublesum0;for(SensorReadingr:elements){count;sumr.getTemperature();}out.collect(key avg(sum/count), countcount);}}).print(Process Avg Temp);env.execute(Flink Window Demo);}}六、何时用哪种处理方式场景推荐实时性要求高 只需简单汇总增量处理 (reduce,aggregate)需要完整窗口统计全量处理 (process,apply)又要快响应又要丰富输出混合模式七、总结✔ 增量处理 —— 快、少空间但无法访问全部数据✔ 全量处理 —— 能访问所有数据结果丰富但占空间✔ 混合模式 —— 最灵活、兼顾性能和业务需求

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询