Flink:数据延迟产生的问题

文章详细阐述了在Flink流处理中三种不同时间概念——事件时间、摄入时间和处理时间,强调了事件时间在业务中的重要性,并通过实例解释了数据延迟可能导致的问题。此外,提出了使用水印来解决网络延迟造成的计算误差问题。
摘要由CSDN通过智能技术生成

Time

在Flink的流式处理中,会涉及到时间的不同概念,如下图所示:

- EventTime[事件时间]

事件发生的时间,例如:点击网站上的某个链接的时间,每一条日志都会记录自己的生成时间

如果以EventTime为基准来定义时间窗口那将形成EventTimeWindow,要求消息本身就应该携带EventTime

- IngestionTime[摄入时间]

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

如果以IngesingtTime为基准来定义时间窗口那将形成IngestingTimeWindow,以source的systemTime为准

- ProcessingTime[处理时间]

某个Flink节点执行某个operation的时间,例如:timeWindow处理数据时的系统时间,默认的时间属性就是Processing Time

如果以ProcessingTime基准来定义时间窗口那将形成ProcessingTimeWindow,以operator的systemTime为准

在Flink的流式处理中,绝大部分的业务都会使用EventTime,一般只在EventTime无法使用时,才会被迫使用ProcessingTime或者IngestionTime。

如果要使用EventTime,那么需要引入EventTime的时间属性,引入方式如下所示:

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) //设置使用事件时间

数据延迟产生的问题

l 示例1

现在假设,你正在去往地下停车场的路上,并且打算用手机点一份外卖。

选好了外卖后,你就用在线支付功能付款了,这个时候是11点50分。恰好这时,你走进了地下停车库,而这里并没有手机信号。因此外卖的在线支付并没有立刻成功,而支付系统一直在Retry重试“支付”这个操作。

当你找到自己的车并且开出地下停车场的时候,已经是12点05分了。这个时候手机重新有了信号,手机上的支付数据成功发到了外卖在线支付系统,支付完成。

在上面这个场景中你可以看到,支付数据的事件时间是11点50分,而支付数据的处理时间是12点05分

一般在实际开发中会以事件时间作为计算标准

l 示例2

一条日志进入Flink的时间为2019-08-12 10:00:01,摄入时间

到达Window的系统时间为2019-08-12 10:00:02,处理时间

日志的内容为:2019-08-12 09:58:02 INFO Fail over to rm2 ,事件时间

对于业务来说,要统计1h内的故障日志个数,哪个时间是最有意义的?---事件时间

EventTime,因为我们要根据日志的生成时间进行统计。

l 示例3

某 App 会记录用户的所有点击行为,并回传日志(在网络不好的情况下,先保存在本地,延后回传)。

A 用户在 11:02 对 App 进行操作,B 用户在 11:03 操作了 App,

但是 A 用户的网络不太稳定,回传日志延迟了,导致我们在服务端先接受到 B 用户 11:03 的消息,然后再接受到 A 用户 11:02 的消息,消息乱序了。

l 示例4

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

我们先来设想一下下面这个场景:

  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时间,来进行计算。在网络有延迟的时候,会引起计算误差。

如何解决?---使用水印解决网络延迟问题

https://blog.csdn.net/weixin_45427648/article/details/130142620

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员无羡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值