Flink原理实战每日一篇05

本文深入探讨了Flink的窗口触发器(如EventTimeTrigger、ProcessTimeTrigger等)和数据剔除器(如CountEvictor、DeltaEvictor等)的原理及使用场景。介绍了如何自定义Trigger和Evictor,并讨论了延迟数据处理、连续窗口计算的概念,以及Windows的多流合并应用。同时,提到了Flink中不同类型的窗口关联方法,如滚动窗口、滑动窗口、会话窗口和间隔关联。
摘要由CSDN通过智能技术生成

接着上面一篇讲吧,下面要讲的东西实际上我基本没用过............好吧,只能硬着头皮再搞一遍,希望这次能彻底的弄明白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 windo
Flink是一个开源的分布式流处理框架,它的运行原理是将数据流分成不同的子任务,这些子任务会在不同的计算节点上并行执行。Flink将数据流看作是一个无限的事件流,每当有新的事件到来时,Flink会将这些事件收集起来,交给对应的算子进行处理,并将结果传递给下一个算子。Flink的运行原理主要包括以下几个方面: 1. 数据流划分:Flink会将数据流划分为多个子任务,并将这些子任务分配到不同的计算节点上。 2. 算子执行:每个子任务会在对应的计算节点上并行执行,数据会经过一系列的算子进行处理,每个算子都会将处理后的数据再次输出到下一个算子。 3. 状态管理:Flink支持对算子状态的管理,可以将算子的状态存储在内存或外部存储中,以便在出现故障时进行恢复。 4. 检查点:Flink会定期生成检查点,用于保存算子的状态以及数据流的位置信息,以便在出现故障时进行恢复。 5. 任务协调:Flink会对所有子任务进行统一的协调和调度,确保数据流的正确处理。 在实际应用中,为了保证Flink的性能,需要进行性能优化。常见的性能优化包括: 1. 调整并行度:适当调整算子的并行度可以提高Flink的性能。 2. 减少数据倾斜:数据倾斜会导致某些节点的负载过高,可以通过数据重分区等方式来减少数据倾斜。 3. 使用状态后端:选择合适的状态后端可以提高Flink的性能,常用的状态后端包括内存和RocksDB。 4. 减少网络开销:减少网络开销可以提高Flink的性能,可以通过调整数据分区、使用压缩算法等方式来减少网络开销。 5. 避免不必要的计算:避免不必要的计算可以提高Flink的性能,可以通过过滤掉不需要处理的数据等方式来避免不必要的计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值