Flink原理实战每日一篇05

接着上面一篇讲吧,下面要讲的东西实际上我基本没用过............好吧,只能硬着头皮再搞一遍,希望这次能彻底的弄明白trigger窗口触发器,以及 evictors 数据剔除器的原理跟使用场景~~~

 

1,Trigger 窗口触发器

  拥有的触发器如下,自行百度~

 EventTimeTrigger :

ProcessTimeTregger:

ContinuousEventTimeTregger:

CountTrigger:

DeltaTrigger:

PurgingTrigger:

如果以上发触发器都满足不了需求,可以自定义触发器:

继承并实现抽象类Trigger 自定义触发器,FlinkTrigger接口共有如下方法需要复写:

OnElement()

OnEventTime()

OnProcessTime ()

OnMerge ()

Clear ()

代码如下:

object TreiggerDemo {
  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val dataStream: DataStream[(Int, Int)] = env.fromCollection(List((1, 2), (3, 4), (1, 3)))
    dataStream.keyBy(_._1)
//      .window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(2)))
      .timeWindow(Time.seconds(10))
        .trigger(ContinuousEventTimeTrigger.of(Time.seconds(5)))
    
    env.execute()
  }
}

调用的 ContinuousEventTimeTrigger类是自带的类:

public class ContinuousEventTimeTrigger<W extends Window> extends Trigger<Object, W> {
   private static final long serialVersionUID = 1L;

   private final long interval;

   /** When merging we take the lowest of all fire timestamps as the new fire timestamp. */
   private final ReducingStateDescriptor<Long> stateDesc =
         new ReducingStateDescriptor<>("fire-time", new Min(), LongSerializer.INSTANCE);

   private ContinuousEventTimeTrigger(long interval) {
      this.interval = interval;
   }

   @Override
   public TriggerResult onElement(Object element, long timestamp, W window, TriggerContext ctx) throws Exception {

      if (window.maxTimestamp() <= ctx.getCurrentWatermark()) {
         // if the watermark is already past the window fire immediately
         return TriggerResult.FIRE;
      } else {
         ctx.registerEventTimeTimer(window.maxTimestamp());
      }

      ReducingState<Long> fireTimestamp = ctx.getPartitionedState(stateDesc);
      if (fireTimestamp.get() == null) {
         long start = timestamp - (timestamp % interval);
         long nextFireTimestamp = start + interval;
         ctx.registerEventTimeTimer(nextFireTimestamp);
         fireTimestamp.add(nextFireTimestamp);
      }

      return TriggerResult.CONTINUE;
   }

   @Override
   public TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception {

     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值