Flink 水位线

泪湿孤枕 提交于 2021-01-26 10:36:24

水位线是什么

窗口 有了,但是要知道我们面对的是实时数据,而这些数据随时会出现延迟的情况,从几秒到几小时都有可能。如果要忽略这些数据,那么显然对于结果的计算是不准确的,可是要等待这些延迟数据的话, 那岂不是等同于批处理了,我们等不了那么久的。这个时候水位线恰好就是来描述和解决这个问题的。它指定一个时间 T,表示时间 T 之前的数据已经全部到达,后续再迟到的数据会被直接丢弃。

水位线用在哪里

显然,使用处理时间来处理事件不会有延迟,因此也不需要水位线。所以水位线只出现在事件时间窗口,因而也可以将水位线看成是事件时间的进度条。通常,当水位线通过窗口的末尾时,会触发窗口的计算操作。

在 Flink 中如何产生水位线

在 data source 中发射水位线

即在 data source 函数中,使用 SourceContext 的 emitWatermark 方法来发射一个水位线 T。

使用水位线生成器

  1. 按照固定周期生成
    这种情况下,Flink 会定时(可以自定义)获取水位线,这里水位线的具体方法由用户实现。
  2. 从特定元素生成
    在数据流中有某种中止信号(如-1、EOF)的时候,特别有用。此外需要注意的是由于这种获取水位线的操作会作用于每一个元素,所以可能会带来性能影响。

并发中的水位线

关于水位线的使用,有两点需要知道:

  1. 水位线是单调递减的,也就是说不允许后出现的水位线比之前的小。
  2. 当有操作依赖于多个流或者并发集合时,该操作会依赖于之前的所有水位线中最小的那个,也就是说该操作可能会等到之前所有的操作的水位线都通过了窗口的末尾,才会触发。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!