成都程序员网站,视频制作软件app下载,网站建设销售岗位职责,受欢迎的扬中网站建设Flink中的时间含义 在实际应用中#xff0c;事件时间语义会更为常见。一般情况下#xff0c;业务日志数据中都会记录数据生成的时间戳#xff08;timestamp#xff09;#xff0c;它就可以作为事件时间的判断基础。 在Flink中#xff0c;由于处理时间比较简单#xff0c…Flink中的时间含义 在实际应用中事件时间语义会更为常见。一般情况下业务日志数据中都会记录数据生成的时间戳timestamp它就可以作为事件时间的判断基础。 在Flink中由于处理时间比较简单早期版本默认的时间语义是处理时间而考虑到事件时间在实际应用中更为广泛从Flink1.12版本开始Flink已经将事件时间作为默认的时间语义了。
事件时间和窗口 水位线的含义
在Flink中用来衡量事件时间进展的标记就被称作“水位线”Watermark。 具体实现上水位线可以看作一条特殊的数据记录它是插入到数据流中的一个标记点主要内容就是一个时间戳用来指示当前的事件时间。而它插入流中的位置就应该是在某个数据到来之后这样就可以从这个数据中提取时间戳作为当前水位线的时间戳了。
水位线特性 窗口的理解
在Flink中我们很容易把窗口理解成为一个固定的框当到达某个时间点时就停止收集数据开始计算并输出结果这种理解时错误的正解如下
生成水位线的原则
完美的水位线是“绝对正确”的也就是一个水位线一旦出现就表示这个时间之前的数据已经全部到齐、之后再也不会出现了。不过如果要保证绝对正确就必须等足够长的时间这会带来更高的延迟。 如果我们希望处理得更快、实时性更强那么可以将水位线延迟设得低一些。这种情况下可能很多迟到数据会在水位线之后才到达就会导致窗口遗漏数据计算结果不准确。当然如果我们对准确性完全不考虑、一味地追求处理速度可以直接使用处理时间语义这在理论上可以得到最低的延迟。 所以Flink中的水位线其实是流处理中对低延迟和结果正确性的一个权衡机制而且把控制的权力交给了程序员我们可以在代码中定义水位线的生成策略。
水位线的传递 在流处理中上游任务处理完水位线、时钟改变之后要把当前的水位线再次发出广播给所有的下游子任务。而当一个任务接收到多个上游并行任务传递来的水位线时应该以最小的那个作为当前任务的事件时钟。 水位线在上下游任务之间的传递非常巧妙地避免了分布式系统中没有统一时钟的问题每个任务都以“处理完之前所有数据”为标准来确定自己的时钟。
迟到数据的处理
迟到水印推进 在水印产生时设置一个乱序容忍度推迟系统时间的推进保证窗口计算被延迟执行为乱序的数据争取更多的时间进入窗口。
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));设置窗口延迟关闭 Flink的窗口也允许迟到数据。当触发了窗口计算后会先计算当前的结果但是此时并不会关闭窗口。 以后每来一条迟到数据就触发一次这条数据所在窗口计算(增量计算)。直到wartermark 超过了窗口结束时间推迟时间此时窗口会真正关闭。
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.allowedLateness(Time.seconds(3))使用侧流接收迟到的数据
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.allowedLateness(Time.seconds(3))
.sideOutputLateData(lateWS)