流式计算中的 Window 计算

一、重点内容:

  • 概述流批计算、实时离线数仓的区别;window计算定义
  • 介绍实时计算中的Watermark概念
  • window类型及其实现原理、高级优化
  • 描述两个业务场景的需求

二、详细知识点介绍:

Watermark

Flink 中的 Time 分为三种:事件时间、达到时间与处理时间。

  • 事件时间:是事件真实发生的时间。
  • 达到时间:是系统接收到事件的时间,即服务端接收到事件的时间。
  • 处理时间:是系统开始处理到达事件的时间。

Flink文档

This is precisely what watermarks do — they define when to stop waiting for earlier events.

If you want to use event time, you will also need to supply a Timestamp Extractor and Watermark Generator that Flink will use to track the progress of event time.

  • Watermark定义:当前系统认为的事件时间所在的真实时间。(它们定义了何时停止等待较早的事件。

  • Watermark产生:从数据的事件时间来产生。最常见的包括使用当前事件时间的时间减去一个固定的delay,来表示可以可以容忍多长时间的乱序。

  • Watermark传递:上游将watermark传递给下游;下游收到多个watermark后默认取其中最小值来作为自身的watermark,同时它也会将自己watermark传递给它的下游。经过整个传递过程,最终系统中每一个计算单元就都会实时的知道自身当前的watermark是多少。

Window

Flink文档

Computing windowed analytics with Flink depends on two principal abstractions: Window Assigners that assign events to windows (creating new window objects as necessary), and Window Functions that are applied to the events assigned to a window.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SJXsBZ97-1659578838405)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16687c486ca04ef0a75aa0dd8bf99445~tplv-k3u1fbpfcp-watermark.image?)]

TUMBLE Window (滚动窗口)
  • 每分钟页面浏览量
  • TumblingEventTimeWindows.of(Time.minutes(1))
HOP Window (滑动窗口)
  • 每分钟的页面浏览量每 10 秒计算一次
  • SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
SESSION Window (会话窗口)
  • 每个会话的页面浏览量,其中会话由会话之间至少 30 分钟的间隔定义
  • EventTimeSessionWindows.withGap(Time.minutes(30))

迟到数据处理

默认情况下,当使用事件时间窗口时,延迟事件会被丢弃。(注意,不是数据的时间晚于watermark就算是迟到,而是它所属的窗口已经被触发了才算迟到)。

1、可以使用称为Side Outputs的机制安排将被丢弃的事件收集到备用输出流

OutputTag<Event> lateTag = new OutputTag<Event>("late"){};

SingleOutputStreamOperator<Event> result = stream.
    .keyBy(...)
    .window(...)
    .sideOutputLateData(lateTag)
    .process(...);
  
DataStream<Event> lateStream = result.getSideOutput(lateTag);

2、drop掉。默认情况下允许的延迟为 0。,watermark后面的元素被丢弃(或发送到侧输出)。

stream.
    .keyBy(...)
    .window(...)
    .allowedLateness(Time.seconds(10))
    .process(...);

注意:side output只有在DataStream的窗口中才可以用,在SQL中目前还没有这种语义,所以暂时只有drop这一个策略。

三、引用参考&推荐书目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值