Flink 水位线
2023-09-02 10:08:13 8 举报
Flink水位线是Flink中用于监控和控制任务执行的一种机制。它通过将任务的进度划分为不同的阶段,并为每个阶段设定一个水位线,来实时监控任务的执行情况。当任务的进度达到某个阶段的水位线时,Flink会触发相应的操作,如触发数据输出、触发告警等。水位线的设置可以帮助用户更好地掌握任务的执行状态,及时发现并解决问题,提高任务的稳定性和可靠性。同时,Flink还提供了灵活的配置选项,用户可以根据自己的需求自定义水位线的设置方式和触发条件,以满足不同场景下的任务监控需求。总之,Flink水位线是一种强大的任务监控工具,能够帮助用户更好地管理和优化Flink作业的执行过程。
作者其他创作
大纲/内容
内置水位线生成器
调用
周期型
水位线
未允许迟到关闭:水位线时间超过窗口结束时间 数据就会丢失允许迟到关闭:水位线时间超过了窗口结束时间+迟到时间 数据就会丢失
1.启动一个线程往Kafka生成数据2.获取环境3.配置Kafka4.获取Kafka数据源5.map将数据转为元组6.通过assignTimestampsAndWatermarks类传入参数:WatermarkStrategy 调用 <加泛型>forMontonusTimestamps() 调用 withTimestampAssigner()参数为 可序列化时间戳分配器那个方法 然后labda表达式 返回数据里面的时间戳7.keyBy分组8.调用时间窗口window滚动10秒一次9.全量聚合10.拿到里面窗口的起始时间和结束时间
有序水位线
有序
正常情况 数据都是乱序进入流中的所以我们找周期内最大的那个时间戳作为水位线有可能有迟到的数据 我们就延迟几秒在计算只有我们有时间 我们假报时间 让窗口延后关闭窗口听从这个时间 等数据来了我们在触发计算但是窗口定时开启
无序
逻辑与上有序一样 只是将第 6 步 的forMontonusTimestamps() 换成forBoundedOutOfOrderness(Duartion.ofSecond(x))
定点型
只有一个方法
一个策略生成器 一个水位线生成器
实现
继承
数据按照生成的顺序进入流中水位线就是自增的 但一对一消耗资源所以我们周期内取最后一条作为当前窗口水位线
度量事件时间-->不能倒退解决:分布式环境网络延迟 背压造成数据乱序水位线也是数据流的一部分 随着数据一起流动,在不同任务之间传输数据到来之后提取数据里面时间戳 作为水位线判断水位线是否到达窗口的触发器的时间 我们会不停的发射水位线 去尝试触发触发器 触发成功窗口结束计算
缺点:如果窗口设置过大 定点时间过小 就会一直不输出 将时间定住触发器触发不了 窗口就不会计算解决办法:动态的调整窗口大小 动态的触发窗口计算
需要重写的接口WaterMarkStrategy 策略生成器WaterMarkGenerator 水位线生成器
1.往Kafka输出数据的时候 最后一条数据给他标志一个特殊事件 后面判断到这个事件说明已经结束了2.自定义实现策略生成器-->WaterMarkStrategy3.只需重写创建水位生成器方法-->CreateWatermarkGenerator和创建时间戳方法-->CreaterTimeStampAssinger 可以默认 可以从数据里提取4.自定义创建静态内部类 实现水位线生成器-->WaterMarkGenerMarkGenerator5.重写WaterMarkGenerMarkGenerator方法6.Onevent方法中判断你拿到的数据是否是特殊数据 如果是特殊数据直接输出水位线定点:事件时间停止
WatermarkStrategy单调递增策略(forMonotonousTimestamps)固定乱序长度策略(forBoundedOutOfOrderness)不生成策略(noWatermarks)
逻辑跟有序一样 只是水位线生成器重写的方法定义一个延迟时间在onPeriodicEmit发射器里面减上延迟时间
自定义水位线
构造器
保证消费一次如果迟到数据还没到 为了保证数据至少一次创建侧输出库 让迟到数据存储到侧输出库通过测输出流输出 span style=\
sideOutputData
对于延迟到的数据我们可以用水位线延迟时间 但是如果一直等不到 水位线可能就会包含了下一个窗口的时间了
1.自定义类实现策略生成器-->WaterMarkStrategy2.只需重写创建水位生成器方法--->createWatermarkGenerator和创建时间戳方法-->createTimestampAssigner 可以默认 可以从数据里提取3.自定义静态内部类 实现水位线生成器-->WaterMarkGenerator4.重写WaterMarkGenerator里的方法5.Onevent方法-->进来一条数据就会走一次这个方法 主要用来拿水位线时间的6.onPeriodicEmit方法-->发射器 发射Onevent提取的时间戳 到达了规定值 就会触发trigger
这里可以传这两个接口
AssignerWithPeriodicWatermarks周期性的生成 watermark默认周期是200ms,也可以通过setAutoWatermarkInterval设置周期时间
在事件触发的方法中发出水位线Punctuated Generator定点生成器会不停的检测OnEvent()中的事件当发现带有水位线信息的特殊事件时 才发出span style=\
无序水位线
有个重载方法参数为 TimestampAssignerSupplier虽然重载 但是最终都继承相同接口Serializable
数据允许迟到允许窗口延长关闭 正常情况窗口触发完成计算之后就会销毁 但是他会等延迟时间到达之后会再次触发窗口计算窗口时间+水位线时间-->计算第一次计算第一次结果+延迟时间-->span style=\
有序和无序最终掉的都是同一个类有序的类构造器默认延迟0秒无序是自己填时间
周期性调用的方法中发出水位线Periodic Generator通过OnEvent判断观察判断输入的事件在onPeriodicEmit()里不停的发出水位线
1.10以前
迟到数据
allowedLateness
1.11以后
1.配置环境2.开启一个线程 往kafka塞数据3.配置kafka环境4.创建侧输出库5.获取数据源 转换6.设置水位线 延迟7.分组 开窗8.是否允许数据迟到-->allowedLateness()9.是否保证消费一次-->sideOutput(测输出库)10.聚合 增量聚合 还是全量聚合11.输出主流 测流->getSideOutPut()
0 条评论
下一页
为你推荐
查看更多