如何在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 是单线程的,所以 window
和 process
不会同时发生)或者给我指点相关文档?
至少有四种不同的方式来解释“每分钟”。在一个二进制维度上,使用事件时间和处理时间之间存在区别(一分钟由事件中的时间戳测量,或一分钟由 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。
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 是单线程的,所以 window
和 process
不会同时发生)或者给我指点相关文档?
至少有四种不同的方式来解释“每分钟”。在一个二进制维度上,使用事件时间和处理时间之间存在区别(一分钟由事件中的时间戳测量,或一分钟由 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。