这是我参与「第四届青训营 -大数据场」笔记创作活动的的第4天
这一章我们的目的是搞清楚Flink是怎么做到实时计算的
我们有几个时间概念要搞清楚:
- 事件时间:数据产生的时间,比如用户刚点击某个按钮的时间
- 处理时间:数据到我们的大数据系统被处理的时间
我们知道flink处理的数据是无界的数据流,我们要实时地去处理数据,那么这个实时不管是1个小时还是严格到每分钟,都要设定一个时间段,并且这个时间段可能是事件时间,对这个事件时间段内的数据进行处理,这就是Flink中的Window计算
Window是什么?
我们把Window分成三类,滚动窗口,滑动窗口,会话窗口
- 滚动窗口:直接根据key划分,每个窗口会按照时间顺序排开,不会重叠
下图是一个统计用户在每个时间段内的行为数据的滚动窗口,这里的key就是user123,数据会根据key进行划分,并且和之前的数据进行聚合,窗口关闭的时候会输出聚合的结果
- 滑动窗口:根据key划分,窗口可能会重叠,所以数据可能处于多个不同的时间窗口内
- 会话窗口:也是按key划分,数据到达就开一个固定大小的window,如果与前面的window有交集就合并window
那么至此,我们学习了Flink中常用的三种窗口,具体需要什么样的实时的业务场景就选择特定的窗口去计算,达到实时性的目的。
但是我们在使用window的时候可能会遇到一个问题,数据产生后不一定会立马到我们的大数据系统,可能会因为各种各样的原因导致延迟到达。比如说我们要统计10:00-11:00这段时间产生的数据,于是开了时间段为1小时的window,但是可能有数据11:05才到。换句话来说,就是事件时间和处理时间之间有一段延迟时间,我们怎么判断这个数据是迟到的,并且怎么处理这个迟到的数据呢?
Watermark
watermark他会从source源源不断的递增地产生出来,表示的就是当前数据的事件时间,他会跟着数据一起往下游传递,这样下游也能知道当前的事件时间是多少了,来判断数据是否迟到
比如说下图是一个时间戳,我们在数据流中插入11这个watermark,在这个watermark之后如果出现比这个watermark小的数据,我们就可以认为他是一个迟到的数据
另外,看一下并行场景下,watermark是怎么产生和传递的?
- 首先watermark会从source源源不断地递增地产生,上游肯定直接给下游广播当前的事件时间,这个很好理解。那下游可能会收到好几个上游给他发的时间,那到底下游当前的事件时间到底以哪个时间为准呢?
答案:下游以收到的所有事件时间最小的作为他当前的事件时间。为什么?watermark隐藏了一层假设,就是说在watermark之后来的数据不应该比watermark的时间小。比如说下图map1发的29说明map1不会再发比29小的数据了,但是map2还可能再发的,所以肯定是以最小的watermark作为当前的时间
那么怎么判断数据在这条时间戳上的位置呢,怎么判断是比watermark小还是大呢?我们结合window来看看:
- 数据过来,一定会划分到一个window中,比如说[10:00-11:00),假如说这个window的截止时间比watermark还小,说明这个数据就是迟到数据。
至此,我们能够判断出来数据是否是迟到了,怎么去处理他呢?
迟到数据处理
其实大多数时候,在window中是直接丢弃这个数据的。
现在看看有没有除了丢弃以外的处理办法
这里就简单说一下,一种是直接设个延迟时间,第二种就给判断出来的延迟数据打个标签之后再处理