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



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是单线程的,所以windowprocess不会同时发生(,或者向我介绍相关文档?

至少有四种不同的方法来解释"每分钟";。在一个二进制维度上,使用事件时间和处理时间之间存在区别(一分钟由事件中的时间戳测量,一分钟由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.

相关内容

  • 没有找到相关文章

最新更新