【问题标题】:Apache Flink: aligning watermark among parallel tasksApache Flink:在并行任务之间对齐水印
【发布时间】:2016-03-24 07:59:39
【问题描述】:

我们正在使用带有水印的周期性事件时间窗口。我们的 Flink App 目前有 4 个并行任务。

在推流过程中,4个任务的水印值都必须关闭才能触发窗口事件。

例如;

任务 1 水印值 = 8

任务 2 水印值 = 1

任务 3 水印值 = 8

任务 4 水印值 = 8

任务 2 正在等待日志更新其水印。但是,这种情况可能发生在任务 2 更新之前,我们希望在它之前触发窗口事件。

是否有任何机制可以对齐所有并行任务的水印或触发窗口事件而不等待其他任务?

【问题讨论】:

  • 我在并行任务中对齐水印没有多大意义。水印的想法是表明没有更多具有较低时间戳的元素可以到达。如果您的任务之一没有看到值 8 的水印,那么这意味着时间戳为 2-8 的元素仍然可以到达。也许你应该切换到处理时间来实现你的目标。但同样,在不同机器上运行的各个任务之间没有同步。
  • 嗨@TillRohrmann,谢谢你的回答。我们有这样一个场景:假设有消息。我们通过它们的发件人键入这些消息。如果有 3 个发件人是同一个人,我们会发出警报。在上面的示例中,我们不能产生警报,因为要产生警报,需要更新具有水印 2 的任务。由于第二个任务,窗口不会被触发,直到一个新的日志。
  • 我认为您对keyBy 的概念有点错误。如果您想查找同一个人的 3 个发件人,那么您应该 keyBy 该人,然后简单地使用计数窗口来生成警报。也许您还想过滤掉同一个人的重复发件人。
  • 但我们还需要考虑事件时间。例如 10 分钟内 3 个发件人(事件时间不是处理时间)。
  • 然后您可以使用带有自定义触发器的事件时间窗口,该触发器在看到 3 个元素时触发。

标签: java streaming apache-flink


【解决方案1】:

@Til Rohrmann 在 cmets 中已经回答了这个问题,主要答案:

如果你想查找 3 个发件人是同一个人,那么你 应该keyBy 这个人,然后简单地使用计数窗口来 生成警报。也许您还想过滤掉重复的发件人 同一个人。

后续问题:

但我们还需要考虑事件时间。例如 3 个发件人 10分钟(事件时间不是处理时间)

后续回答:

然后您可以使用带有自定义触发器的事件时间窗口 当它看到 3 个元素时触发。

我想关键的结论是: 如果你想触发一些东西的计数,keyBy那个字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多