《Flink应用开发技术》课件-项目3:DataStream API高阶特性(实时计算核心)_第1页
《Flink应用开发技术》课件-项目3:DataStream API高阶特性(实时计算核心)_第2页
《Flink应用开发技术》课件-项目3:DataStream API高阶特性(实时计算核心)_第3页
《Flink应用开发技术》课件-项目3:DataStream API高阶特性(实时计算核心)_第4页
《Flink应用开发技术》课件-项目3:DataStream API高阶特性(实时计算核心)_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目3-1DatastreamAPI高阶特性:窗口与处理函数1目录CONTENTS01.知识准备02.任务实现:热门URL统计TopN03.总结与注意事项201知识准备3无限流处理的挑战与窗口机制Windowing:TamingtheInfiniteStream无限数据流的挑战数据无界、计算资源有限、需持续输出有价值的信息。窗口的核心作用将无限数据切割成有限块,实现限定数据范围、防止系统过载、并支持状态管理。Flink原生窗口类型概览滚动窗口固定大小,无重叠滑动窗口固定大小,有重叠会话窗口动态间隙,合并碎片全局窗口覆盖全局,手动触发4滚动窗口(TumblingWindow)固定大小、无重叠的窗口,适合周期性统计。基于处理时间的滚动窗口以处理时间为基准,将数据分配到固定时长的窗口中。适用于对延迟要求极高、可接受近似结果的场景。代码示例:每5秒统计一次单词访问量stream.keyBy(word->word).window(TumblingProcessingTimeWindows.of(Time.seconds(5))).reduce((a,b)->a+b).print();时间语义对比ProcessingTime基于机器系统时间,处理简单,延迟最低,但结果受机器影响,不精确。EventTime基于事件自带时间戳,结果精确,可处理乱序,但需要配合水印,延迟较高。5滑动窗口(SlidingWindow)通过窗口大小与滑动步长两个参数定义,数据可能同时属于多个窗口,实现平滑统计。事件时间滑动窗口示例//每10分钟统计最近1小时的URL访问量stream.keyBy(event->event.url).window(SlidingEventTimeWindows.of(Time.hours(1),Time.minutes(10))).aggregate(newCountAggregate()).print();此例中,窗口大小为1小时,滑动步长为10分钟,因此一个事件最多可能属于6个不同的窗口计算。窗口分配机制核心逻辑在于assignWindows方法,它会为每个元素分配其所属的所有窗口。滑动窗口通过重叠计算实现数据平滑,但资源开销相对更高。6会话窗口(SessionWindow)基于活跃间隙(Gap)动态合并数据碎片,适用于捕捉用户活动或任何不连续发生的突发性事件。间隙(Gap)策略静态间隙(StaticGap)全局统一的固定时长,如30分钟无活动则结束会话。动态间隙(DynamicGap)根据事件特征动态计算间隙,如用户等级决定超时时间。事件时间会话窗口示例//当用户访问间隔超过30分钟,则开启新会话stream.keyBy(event->event.userId).window(EventTimeSessionWindows.withGap(Time.minutes(30))).aggregate(newSessionAnalysis()).print();该模式能灵活应对无序或突发流量,精准捕捉真实会话,但间隙参数对结果影响敏感。7全局窗口(GlobalWindow)覆盖整个数据流的单一窗口,默认永不触发计算,必须搭配自定义触发器使用,赋予开发者完全的控制权。代码结构示例stream.keyBy(event->event.id).window(GlobalWindows.create()).trigger(newCountTrigger(1000))//自定义触发器.evictor(...)//可选驱逐器.process(newGlobalAnalysis()).print();适用于需要人工控制触发时机的复杂场景,如按特定业务规则触发。自定义触发器(Trigger)通过继承Trigger接口,实现基于元素数量、处理时间或事件时间的触发逻辑。⚠️重要提醒需警惕状态无限增长带来的内存风险,建议结合Evictor或StateTTL使用。8增量聚合函数:高效计算的核心窗口未闭合前持续更新结果,状态占用低,延迟小,是提升实时性能的首选策略。ReduceFunction要求输入和输出类型一致,适合简单的归并操作,如求和、取最大值。.reduce((a,b)->a+b)AggregateFunction更通用,支持中间累加器,可完成均值、标准差等复杂统计。.aggregate(newAverageAggregate())以单词计数为例,每来一条数据,对应单词的计数就立即增加,无需等待窗口结束。9全量聚合函数:信息完整性的保障窗口触发后,一次性迭代窗口内所有数据,可访问窗口元数据,支持复杂业务逻辑。ProcessWindowFunction示例计算窗口内数字平均值,并输出窗口起止时间。.process(newProcessWindowFunction[IN,OUT,KEY,W]{

overridedefprocess(key:KEY,context:Context,elements:Iterable[IN],out:Collector[OUT]):Unit={

valwindowStart=context.window.getStart

//...迭代elements计算avg

//然后使用out.collect输出结果

}

})优势可访问窗口元数据(如起止时间),支持复杂逻辑。劣势需缓存全量数据,内存占用高,延迟大。最佳实践与增量聚合结合使用,兼顾性能与信息完整性。10处理函数(ProcessFunction)家族作为底层API,提供访问事件时间、水位线和注册定时器的能力,是构建复杂事件驱动应用的基石。富函数(RichFunction)特性生命周期管理:提供open()和close()方法。状态管理:通过RuntimeContext访问KeyedState。侧输出流(SideOutput):将数据分流处理。核心子类KeyedProcessFunctionProcessWindowFunctionCoProcessFunctionProcessAllWindowFunction1102任务实现:热门URL统计TopN12任务实现:热门URL统计TopN实时统计滑动窗口内URL访问量,并输出每个窗口内访问量前N的URL。1.自定义Source模拟日志流→2.定义POJO数据模型→3.增量聚合统计访问次数→4.全量包装封装窗口信息→5.KeyedProcessFunction实现TopN排序13步骤1:自定义Source模拟日志流继承SourceFunction接口,构建模拟数据源,按固定间隔随机生成数据。核心逻辑稳定性提示数据源的稳定性对窗口触发准确性至关重要,需处理好取消标志位。14步骤2:定义数据模型清晰的数据模型是构建健壮流处理应用的基础。Event5:原始事件封装原始日志中的URL、用户行为、IP和时间戳。url:Stringbehavior:Stringip:Stringtimestamp:LongUrlViewCount:中间结果封装URL、访问计数、窗口起止时间,为后续按窗口分组排序提供必要条件。url:Stringcount:LongwindowStart:LongwindowEnd:Long15步骤3:增量聚合统计访问次数实现AggregateFunction接口,对窗口内的Event5进行高效计数。每来一条数据,计数+1CountAggregate实现定义累加器为长整型,每来一条Event5,累加器值增加1。该过程持续更新,状态仅保存一个数字,内存占用极低。16步骤4:ProcessWindowFunction包装结果将增量聚合得到的裸数字,封装成包含完整窗口信息的UrlViewCount对象。输入(URL,裸计数)包装逻辑在process方法内,通过Context获取窗口起止时间。.此步骤牺牲部分性能,但换来窗口元数据的完整保留,为后续处理提供必要条件。17步骤5:KeyedProcessFunction实现TopN任务核心逻辑:按窗口分组收集所有URL计数,注册定时器,在窗口结束后触发排序并输出TopN。收集使用ListState缓存当前窗口内所有UrlViewCount→定时注册窗口结束时间的定时器,保证窗口完全闭合→排序在onTimer()中,将列表按访问量排序,输出前N名→清理输出后,及时清理ListState中的数据,释放资源定时器是保证结果准确性的关键,它确保排序逻辑在窗口完全闭合后才执行。18主程序链路梳理一行代码对应一个步骤,数据形状在管道中逐步变换,最终得到目标结果。env:设置时间语义与水印策略addSource:Event5(url,behavior,ip,ts)filter:过滤无效记录keyBy(url):按URL分组window:开窗(滑动10分钟,步长5分钟)aggregate:增量聚合(URL,裸计数)process:全量包装(UrlViewCount)keyBy(windowEnd):按窗口结束时间分组process(Keyed):TopN排序并输出19执行结果与输出格式控制台将每5分钟更新一次,反映最近10分钟的累计访问TopN。典型输出示例格式清晰,包含窗口时间和排名信息。语义保证EventTime并搭配合理水印,结果可做到Exactly-Once语义。扩展提示在并发源场景下,需关注顺序与迟到事件的处理,可使用SideOutput收集迟到数据。2003总结与注意事项21总结:窗口机制核心价值窗口是处理无限流的核心抽象,通过限定边界将无界数据转化为可计算的有界块。滚动窗口适合周期性报表滑动窗口适合平滑指标监控会话窗口适合用户行为分析全局窗口适合人工触发场景根据业务特征与资源预算合理选择窗口类型,是实时作业设计的第一步。22总结:计算函数选型与性能权衡增量聚合(Reduce/Aggregate)延迟:低状态:小信息:少全量聚合(ProcessWindow)延迟:高状态:大信息:多选型口诀:高频统计选增量,低频报表选全量,既要性能又要元数据则两者结合。注意全量模式的数据膨胀风险,建议设置最大窗口大小或采用Evictor机制。23总结:时间语义与水印策略要点EventTime与WatermarkEventTime能提供端到端一致性,但必须配套水印策略处理乱序。水印延迟设置经验公式最大乱序时间+容忍迟到时间延迟过长会增大状态,过短则易丢数据。并行源场景水印取最小值机制可能导致窗口触发滞后,需监控各分区水印差异。迟到事件处理通过allowedLateness或sideOutputLateData进行妥善处理。24总结:状态管理与定时器最佳实践状态生命周期管理三要素初始化在open()中创建清理使用StateTTL或onTimer清理容错结合Checkpoint保证一致性定时器(Timer)最佳实践在onTimer方法内完成相关状态的清理,避免内存泄漏。避免注册过多定时器,尤其是在处理时间语义下,可能导致性能问题。KeyedProcessFunction是构建复杂业务逻辑的利器,但需牢记状态与定时器成对清理原则。25项目3-2DataStream高阶实战26目录CONTENTS01.触发器:让窗口听你的02.驱逐器:窗口内的数据筛子03.水印:乱序数据的节拍器04.实战:触发器、驱逐器05.实战:水印与侧流高压检测27目录CONTENTS01.实战:设备掉线HeartbeatMonitor02.整合:主程序与数据模型03.总结与调优要点2801触发器:让窗口听你的29触发器:让窗口听你的控制窗口计算的触发时机,支持事件驱动与时间驱动逻辑注入业务逻辑重写四个方法,将业务逻辑注入窗口计算流程。onElementonEventTimeonProcessingTimeclear30状态与结果:Trigger决策模型键控状态记录累计次数、最大时间戳等业务指标,支持ValueState、ListState等。资源清理clear()方法必须清除状态,防止作业重启或key过期时资源泄漏。四种TriggerResult决策CONTINUE继续等待FIRE触发计算PURGE清理数据FIRE_AND_PURGE触发并清理3102驱逐器:窗口内的数据筛子32驱逐器:窗口内的数据筛子数据流入Trigger决定何时Evictor决定算什么WindowFunction执行计算evictBefore()计算前移除元素evictAfter()计算后移除元素典型实现与性能考量实现Evictor接口需给出evictBefore与evictAfter逻辑,内部通过Iterable移除元素。核心价值过滤无效数据,优化滑动窗口存储。动态选择数据子集,如保留最近N条。注意事项与增量聚合函数结合时,需注意驱逐元素已参与中间结果,避免状态不一致。3303水印:乱序数据的节拍器34水印:乱序数据的节拍器水印是事件时间进度标志,Flink用其触发事件时间定时器并判断迟到。周期性按固定间隔提升水印,平衡延迟与开销。单调递增每条事件后更新,适用于有序流。无水印依赖处理时间,用于测试或特殊场景。自定义实现WatermarkGenerator,灵活控制生成逻辑。35自定义生成与参数调优核心接口onEvent():事件驱动,更新最大时间戳。onPeriodicEmit():周期性发射,如maxTs-200ms。关键参数setAutoWatermarkInterval():设置发射周期。allowedLateness:允许延迟,平衡状态大小与数据完整性。最佳实践平衡延迟与吞吐量允许延迟过大导致状态膨胀,过小易误判迟到。侧流处理迟到数据结合OutputTag,让迟到元素单独处理,保证主流计算完整性。3604实战:自定义触发器、驱逐器37实战:自定义触发器OverheatTrigger需求设备温度连续3次超过80℃时触发报警。状态设计使用ValueState记录同一设备在窗口内的连续超温次数。逻辑onElement中,若连续超温则递增计数器,否则清零。累计达3次则返回FIRE并清零。KeyedStream按设备ID分区Window定义时间窗口Trigger绑定OverheatTrigger输出结果触发后,窗口输出包含

设备ID、

连续超温次数、

最新温度及

窗口结束时间,

供下游格式化报警。触发逻辑与窗口绑定38实战:驱逐器与数据过滤DataFilterEvictor过滤前(窗口内数据)Data(t=85,p=50)Data(t=-10,p=60)Data(t=82,p=55)Data(t=88,p=-5)evictBefore过滤后(有效数据)Data(t=85,p=50)Data(t=82,p=55)...(无效数据被移除)该驱逐器与OverheatTrigger配合,可在触发前剔除传感器跳变导致的假超温,确保连续计数逻辑准确。3905实战:水印与侧流高压检测40实战:水印与高压检测MyWatermarkStrategy周期性发射maxTs+200ms,允许200ms乱序。高压检测窗口使用TumblingEventTimeWindows,计算5秒平均压力。侧流输出(SideOutput)当平均压力>100MPa,通过OutputTag输出报警,与主流分离

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论