|NO.Z.00034|——————————|BigDataEnd|——|Hadoop&Flink.V01|——|Flink.v01|Flink Time|Time|数据延迟|参数问题|

一、Flink Time
### --- Time

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

~~~     # - 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的时间属性,
### --- Flink Time引入Time

~~~     # 设置使用事件时间:引入方式如下所示
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)       
二、数据延迟产生的问题
### --- 示例1

~~~     # 现在假设,你正在去往地下停车场的路上,并且打算用手机点一份外卖。
~~~     选好了外卖后,你就用在线支付功能付款了,这个时候是11点50分。
~~~     恰好这时,你走进了地下停车库,而这里并没有手机信号。
~~~     因此外卖的在线支付并没有立刻成功,而支付系统一直在Retry重试“支付”这个操作。
~~~     当你找到自己的车并且开出地下停车场的时候,已经是12点05分了。
~~~     这个时候手机重新有了信号,手机上的支付数据成功发到了外卖在线支付系统,支付完成。
~~~     在上面这个场景中你可以看到,支付数据的事件时间是11点50分,
~~~     而支付数据的处理时间是12点05分一般在实际开发中会以事件时间作为计算标准
### --- 示例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,因为我们要根据日志的生成时间进行统计。
### --- 示例3

~~~     某 App 会记录用户的所有点击行为,
~~~     并回传日志(在网络不好的情况下,先保存在本地,延后回传)。
~~~     A 用户在 11:02App 进行操作,B 用户在 11:03 操作了 App,
~~~     但是 A 用户的网络不太稳定,回传日志延迟了,
~~~     导致我们在服务端先接受到 B 用户 11:03 的消息,然后再接受到 A 用户 11:02 的消息,消息乱序了。
### --- 示例4

~~~     在实际环境中,经常会出现,因为网络原因,数据有可能会延迟一会才到达Flink实时处理系统。
~~~     我们先来设想一下下面这个场景:
~~~     # 使用时间窗口来统计10分钟内的用户流量
~~~     # 有一个时间窗口

~~~     - 开始时间为:2017-03-19 10:00:00
~~~     - 结束时间为:2017-03-19 10:10:00
~~~     # 有一个数据,因为网络延迟

~~~     - 事件发生的时间为:2017-03-19 10:10:00
~~~     - 但进入到窗口的时间为:2017-03-19 10:10:02,延迟了2秒中
~~~     # 时间窗口并没有将59这个数据计算进来,导致数据统计不正确

~~~     这种处理方式,根据消息进入到window时间,来进行计算。
~~~     在网络有延迟的时候,会引起计算误差。如何解决?---使用水印解决网络延迟问题
~~~     通过上面的例子,我们知道,在进行数据处理的时候应该按照事件时间进行处理,
~~~     也就是窗口应该要考虑到事件时间
~~~     但是窗口不能无限的一直等到延迟数据的到来,
~~~     需要有一个触发窗口计算的机制也就是我们接下来要学的watermaker水位线/水印机制

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on   yanqi_vip  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示