这是我参与「第四届青训营 」笔记创作活动的第6天
关于Watermark简易理解,加举例
什么是 Watermark?
表示系统认为的当前真实的事件时间
如何产生Watermark?
如何计算Watermaker?
Watermaker = 数据的事件时间-最大允许的延迟时间或乱序时间
Watermaker如何触发窗口计算的?
Watermaker = 当前窗口的最大的事件时间–最大允许的延迟时间或乱序时间 这也就是说明只要不断有数据来,就可以保证Watermaker是不断变大的,那么最终—定是会触发窗口计算的
因为 Watermaker >= 窗口的结束时间,所以 Watermaker = 当前窗口的最大的事件时间–最大允许的延迟时间或乱序时间,那么当前窗口的最大的事件时间 – 最大允许的延迟时间或乱序时间 >= 窗口的结束时间。
举例: 有一个10点到11点的一个窗口,有3个事件时间分别是 X 11:10 Y 11:35 Z 11:25 依次到达同时前面已有数据到达
在无watermark机制情况下,X数据就属于迟到
在watermark机制下,并设置最大允许的延迟时间或乱序时间为20分钟,那么X到达时 当前窗口的最大的事件时间X 11:10 - 20 = 9:50 < 11:00 那么X就不属于迟到。Y到达时 Y 11:35 - 20 = 11:15 >= 11:00 故Y迟到。
典型问题
一 Per-partition Vs per-subtask watermark生成
Per-subtask watermark生成:早期版本都是这种机制。典型的问题是如果一个source subtask消费多个partition,那么多个partition之间的数据读取可能会加剧乱序程度。
Per-partition watermark 生成:新版本引入了基于每个partition单独的watermark生成机制,这种机制可以有效避免上面的问题。
二 迟到数据处理
因为watermark表示当前事件发生的真实时间,那晚于watermark的数据到来时,系统会认为这种数据是迟到的数据。
算子自身来决定如何处理迟到数据:Window聚合,默认会丢弃迟到数据 动双流join,如果是outer join,则可以认为它不能join到任何数据 CEP,默认丢弃。