这是我参与「第四届青训营 」笔记创作活动的的第3天
1. watermark
watermark的核心思想是延迟一段时间等待乱序数据的到达。且等待时间有限,如果超出时限,只能丢弃这个延迟数据。个人理解,watermark本质上就是时间戳,反应的是时间发生的时间。
watermark告诉Flink一个消息(事件)可以延迟的时长。可以将其理解成水位线,这个水位线随着数据的变化而变化高度。
乱序概念的补充: 乱序指数据到达的顺序和其实际产生时间的排序不一致。导致这的原因有很多,比如延迟,消息积压,重试等等。
2. window
window可以分为两类
-
CountWindow:按照被指定的数据的个数生成window
-
TimeWindow:按照时间生成window,有滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)三种。
滚动窗口根据固定时间长度切分数据。一个数据一个窗口。
滚动窗口由固定的窗口长度和滑动间隔组成。一个数据可以有多个窗口。
会话窗口会将每条数据单独放进一个窗口,如果window之间有交集,就对window进行merge。
对迟到数据的处理
迟到数据:一条数据到达时,windowAssigner会将其分配给一个window。如果这个数据的watermark大于这个window的window end,则这个数据是一条迟到数据。
- 默认讲迟到数据丢弃。
- Allow lateness:窗口end的时候,会多保持allowlateness的时间,如果这时候还有数据来,就接受这一条数据。
- Sideoutput:对迟到数据打一个tag,在Datastream里通过这个tag获取迟到数据流,然后业务层自行选择进行处理。
EMIT
EMIT指的是在window结束之前提前提取数据。通常用于window size较大的情况。
mini-batch
正常情况下,数据流每传输一条数据,就处理一条数据。如果数据流量很大,系统负荷会很大。使用Mini-Batch之后,输入的数据会存储在算子内部的buffer里,达到指定的容量或时间阈值后再做聚合逻辑。这样,一批数据内的每个key只需要执行一次状态读写。如果key的量相对比较稀疏,优化效果更加明显。(见:Flink SQL流式聚合Mini-Batch优化原理浅析 )