Samza有一个窗口化的概念,其中流处理作业需要定期执行某些操作,而不管该作业正在处理多少传入消息。
例如,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中可用的相关较低级别机制是事件时间和处理时间窗口以及计时器,它们是流程功能的一部分。有关自定进度的教程、示例和带解决方案的练习,请参阅学习调情:动手训练。
但使用Flink,使用SQL或Table API更容易实现窗口化。例如,一个简单的每处理时间分钟事件计数器如下所示:
SELECT COUNT(*)
FROM Events
GROUP BY TUMBLE(proctime, INTERVAL '1' MINUTE)
有关更多信息,请参阅有关使用SQL开窗的文档和有关使用表API开窗的文档。有关Flink SQL的教程,请参阅https://github.com/ververica/sql-training.