聚合类的处理
Flink可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的 页。所以Flink引入了窗口概念。
窗口window
对于Flink,如果来一条消息计算一条,这样是可以的,但是这样计算是非常频繁而且消耗资源,如果想做一些统计这是不可能的。
窗口的作用是为了周期性地获取数据。就是把传入的原始数据流切分成多个buckets,所有计算都在单一的buckets中进行。窗口(window)就是从 Streaming 到 Batch 的一个桥梁。
start_time, end_time:每个window都会有一个开始时间和结束时间(前开后闭),这个时间是系统时间。
只要属于此窗口的第一个元素到达,就会创建一个窗口,当时间(事件或处理时间)超过其结束时间戳加上用户指定的允许延迟(allowedLateness)时,窗口将被完全删除。
窗口分类可以分成:翻滚窗口(Tumbling Window,无重叠),滚动窗口(Sliding Window,有重叠),和会话窗口(Session Window,活动间隙)。
乱序(out-of-order)或延迟数据
什么是乱序呢?可以理解为数据到达的顺序和其实际产生时间的排序不一致。导致这样的原因有很多,比如延迟、消息积压、重试等等。
我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于 络、背压等原因,导致乱序的产生(out-of-order或者说late element)。
针对乱序/延迟的问题,其解决方案就是 Watermark / allowedLateness / sideOutput 这一组合拳。
Watermark(水位线) 的作用是防止 数据乱序 / 指定时间内获取不到全部数据。
allowedLateness 是将窗口关闭时间再延迟一段时间。
sideOutput 是最后兜底操作,当指定窗口已经彻底关闭后,就会把所有过期延迟数据放到侧输出流,让用户决定如何处理。
简单来说,就是用Window把流数据分块处理,用Watermark确定什么时候不再等待更早的数据/触发窗口进行计算,用allowedLateness 将窗口关闭时间再延迟一段时间。用sideOutput 最后兜底把延迟数据导出到其他地方。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!