Flink的水印机制

论坛 期权论坛 脚本     
已经匿名di用户   2022-7-2 22:16   4189   0

一.Flink流处理时间方式 :

EventTime[事件时间] 事件发生的时间,例如:点击网站上的某个链接的时间

IngestionTime[摄入时间] 某个Flink节点的source operator接收到数据的时间,例如:某个source消费到kafka中的数据

ProcessingTime[处理时间] 某个Flink节点执行某个operation的时间,例如:timeWindow接收到数据的时间

设置Flink流处理的时间类型(一般在生产环境中,都是使用EventTime来进行计算的)

// 设置为按照事件时间来进行计算
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
// 设置为按照处理时间来进行计算
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)

二.水印机制产生的原因:

在实际环境中,经常会出现,因为网络原因,数据有可能会 延迟 一会才到达Flink实时处理系统,即:网络延迟

因为网络原因造成数据无法被计算:(若处理时间<=结束时间 会被计算)(ps:eventtime和processingtime都是处理时间)

1. 使用时间窗口来统计10分钟内的用户流量

2. 有一个时间窗口 开始时间为:2017-03-19 10:00:00 结束时间为:2017-03-19 10:10:00

3. 有一个数据,因为网络延迟 事件发生的时间为:2017-03-19 10: 10 :00 但进入到窗口的时间为:2017-03-19 10:10: 02 ,延迟

了2秒中

4. 时间窗口并没有将 59 这个数据计算进来,导致数据统计不正确

这种处理方式,根据消息进入到window时间,来进行计算。在网络有延迟的时候,会引起计算误差。

三.使用水印解决网络延迟问题

水印(watermark)就是一个 时间戳 ,Flink可以给数据流添加水印,可以理解为:收到一条消息后,额外给这个消 息添加了一个时间字段,这就是添加水印。

1.水印并不会影响原有Eventtime

2.当数据流添加水印后,会按照水印时间来触发窗口计算

3.一般会设置水印时间,比Eventtime小几秒钟

4.当接收到的消息一直到水印时间 >= 窗口的endTime ,则触发计算

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP