如何在apache flink中实现类似samza的WindowableTask?

How to implement a WindowableTask similar to samza in apache flink?

Samza 有一个概念 windowing,其中流处理作业需要定期执行某些操作,而不管该作业正在处理多少传入消息。

例如,samza 中的一个简单的每分钟事件计数器如下所示:

public class EventCounterTask implements StreamTask, WindowableTask {

  public static final SystemStream OUTPUT_STREAM =
    new SystemStream("kafka", "events-per-minute");

  private int eventsSeen = 0;

  public void process(IncomingMessageEnvelope envelope,
                      MessageCollector collector,
                      TaskCoordinator coordinator) {
    eventsSeen++;
  }

  public void window(MessageCollector collector,
                     TaskCoordinator coordinator) {
    collector.send(new OutgoingMessageEnvelope(OUTPUT_STREAM, eventsSeen));
    eventsSeen = 0;
  }
}

有人可以让我知道如何在 apache flink 中实现等效的东西吗(samza 是单线程的,所以 windowprocess 不会同时发生)或者给我指点相关文档?

至少有四种不同的方式来解释“每分钟”。在一个二进制维度上,使用事件时间和处理时间之间存在区别(一分钟由事件中的时间戳测量,或一分钟由 CPU 挂钟测量)。另一个二进制维度与分钟是否与 UTC 或第一个事件对齐有关。

Flink 中可用的相关底层机制是event time and processing time windows, and timers, which are part of process functions. For self-paced tutorials, examples, and exercises with solutions, see Learn Flink: Hands-on Training

但是对于 Flink,使用 SQL 或 Table API 更容易完成窗口化。例如,一个简单的每处理时间-分钟事件计数器将是这样的:

SELECT COUNT(*)
FROM Events
GROUP BY TUMBLE(proctime, INTERVAL '1' MINUTE)

有关更多信息,请参阅 docs on windowing with SQL and the docs on windowing with the Table API. For tutorials on Flink SQL, see https://github.com/ververica/sql-training