每个子任务/分区是不是可以有一个窗口

Posted

技术标签:

【中文标题】每个子任务/分区是不是可以有一个窗口【英文标题】:Is it possible to have a window per sub-task/partition每个子任务/分区是否可以有一个窗口 【发布时间】:2021-01-22 05:13:37 【问题描述】:

我正在使用 Flink 使用来自具有多个分区的 Kafka 主题的数据。是否可以在每个并行子任务/分区上都有一个窗口而不必使用keyBy(因为我想避免洗牌)。根据文档,我只能在键控窗口(需要随机播放)或全局窗口(将并行度降低到 1)之间进行选择。

动机是我想使用CountWindow 通过自定义触发器来批处理消息,该触发器也会在设定的处理时间后触发。因此,对于每个 Kafka 分区,我想将 N 条记录一起批处理或等待 X 量的处理时间,然后再将批处理发送到下游。

谢谢!

【问题讨论】:

【参考方案1】:

没有好办法。

一种解决方法是在自定义接收器中实现批处理和超时逻辑。您希望实现CheckpointedFunction 接口以使您的解决方案具有容错性,并且您可以使用Sink.ProcessingTimeService.ProcessingTimeCallback 接口进行超时。

更新:

刚刚想到了另一种解决方案,类似于您在下面的评论中的解决方案。您可以实现一个发送周期性心跳的自定义源,并将其广播到 BroadcastProcessFunction。

【讨论】:

谢谢。我想这样做的限制是我无法在 Sink 上链接进一步的操作。目前,我已经确定了一个 FlatMap 并配置上游以发送定期消息以“推送”每个批次。

以上是关于每个子任务/分区是不是可以有一个窗口的主要内容,如果未能解决你的问题,请参考以下文章

FLINK基础(92): DS算子与窗口单流算子KeyBy

Win32:是不是可以显示窗口但将其从任务栏中隐藏?

Qt中怎样将一个子窗口填充满父窗口,比如,一个QTreeWidget窗口覆盖在一个QWidget窗口上,谢谢

SQL Server2008窗口计算

获取任务栏中的窗口(EnumWindows函数)

SQL Server 分区窗口中多个属性的 Min() 和 Max()