一.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 ,则触发计算
|