Flink Timer定时器机制与具体实现

Timer简介

Timer定时器是Flink Streaming API提供的用于感知并利用处理时间/事件事件变化的机制
最显示了timer的方式就是KeyedProcessFunction.在其processElement()方法中注册Timer,然后覆盖其onTimer方法作为Timer触发时间的回调逻辑,根据时间特征的不同:

  1. 处理时间–调用context.timerService().registerProcessingTime()注册;onTimer()在系统时间戳到达timer设定的时间戳时候触发
  2. 事件时间–调用Context.timerService().registerEventTimer()注册,onTimer()在Flink内部水印到达或超过Timer设定的时间戳触发

Timer使用举例

1.按天实时统计指标并存储在状态中,每天0点清除状态重新统计,就可以在processElement()方法里注册Timer

//按天实时统计指标并存储在状态中,每天0点清除状态重新统计,就可以在processElement()方法里注册Timer
ctx.timerService().registerProcessingTimeTimer(
  tomorrowZeroTimeStampMs(System.currentTimeMillis(),8)+1
)
public static long tomorrowZeroTimestampMs(long now,int timeZone){
    
    
  return now-(now+timeZone*3600000)%86400000+86400000
}
  1. 在窗口机制中也有重要的地位,提起窗口自然能够想到Trigger,即触发器。Flink自带的EventTimeTrigger的部分代码,它是事件时间特征下的默认触发器。当水印还没有到达窗口右边沿时候,就注册以窗口右边沿时间戳的Timer,Timer到期后触发onEventTime()方法,进而出发关闭该窗口
@override
public TriggerResult onElement(Object element,long timestamp,TimeWindow window,TriggerContext ctx) throws Exeption{
    
    
   if(window.maxTimestamp()<=ctx.getCurrentWatermark()){
    
    
     return TriggerResult.FIRE;
   }else{
    
    
     ctx.registerEventTimeTimer(window.maxTimestamp())
     return TriggerResult.CONTINUE;
   }
}


@override
public TriggerResult onEventTime(long time,TimeWindow window,TriggerContext ctx){
    
    
   return time == window.maxTimestamp()?TriggerResult.FIRE:TriggerResult.CONTINUE;
}

Timer的特点

  1. 作用于keyedStream : Timers are registered on a keyedstream
  2. Timers是自动复制的:Timers are automatically deduplicated
  3. timers 被flink持久化保存:Timers are checkpointed by flink
  4. timers可以被删除 timers can be deleted

Timers的原理分析

可参考
https://blog.csdn.net/nazeniwaresakini/article/details/104220113

猜你喜欢

转载自blog.csdn.net/weixin_38813363/article/details/114886030
今日推荐