Flink Timer
Timer简介
Timer定时器是Flink Streaming API提供的用于感知并利用处理时间/事件事件变化的机制
最显示了timer的方式就是KeyedProcessFunction.在其processElement()方法中注册Timer,然后覆盖其onTimer方法作为Timer触发时间的回调逻辑,根据时间特征的不同:
- 处理时间–调用context.timerService().registerProcessingTime()注册;onTimer()在系统时间戳到达timer设定的时间戳时候触发
- 事件时间–调用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
}
- 在窗口机制中也有重要的地位,提起窗口自然能够想到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的特点
- 作用于keyedStream : Timers are registered on a keyedstream
- Timers是自动复制的:Timers are automatically deduplicated
- timers 被flink持久化保存:Timers are checkpointed by flink
- timers可以被删除 timers can be deleted
Timers的原理分析
可参考
https://blog.csdn.net/nazeniwaresakini/article/details/104220113