繁体   English   中英

连接两个数据流的正确 Apache 波束窗口策略

[英]Correct Apache beam windowing strategy for joining two streams of data

我有一个用例,我需要从两个流中读取数据并通过键连接它们。 一个 stream 包含一个发送记录,另一个 stream 包含对此发送的确认。 所以我会在stream1中找到1个键为123的元素,在stream2中找到1个键为123的元素。 发送和确认可能随时在任一流中到达,但我可以假设发送出现在确认之前。 然而,确认可能会丢失,系统永远不会丢失发送。 我想限制我等待 ack 说 3 分钟的时间(为了简化)。

在这种情况下使用的最佳窗口策略是什么?

  1. 如果我使用固定的 windows,则发送和确认可能位于两个不同的 windows 中,我将无法加入。 我可能会使用迟到 API,但在这种情况下我应该累积窗格吗?

  2. 我尝试使用间隔持续时间为 3 分钟的 session window,但在 3 分钟结束时我没有看到触发器。 加入发生在 6 分钟后。 这是我的代码:

    加入代码:

     private static <T> Window<T> window() { return Window.<T>into(Sessions.withGapDuration(Duration.standardMinutes(3))).triggering(AfterWatermark.pastEndOfWindow()).withAllowedLateness(Duration.ZERO).discardingFiredPanes(); } PCollection<KV<String, Record>> sendStream = KafkaIO.readRecord().withTopic(pipelineOptions.getInputTopic()).window(); PCollection<KV<String, Record>> ackStream = KafkaIO.readRecord().withTopic(pipelineOptions.getInputTopic()).window(); PCollection<KV<String,String>> joins = sendStream.apply("Joining Streams", Joins.innerJoin(ackStream)).apply(...);

    Output:

    19-01-2022 11:41:19 Send: 1mtz7n-kxi88e7a-89
    19-01-2022 11:42:19 Ack: 1mtz7n-kxi88e7a-89
    19-01-2022 11:48:33 JoinedByKey: 1mtz7n-kxi88e7a-89

我看到延迟从 6 到 7 分钟不等。 我的印象是 session 应该只能持续 3 分钟。

我还想在两个流中都收到事件时触发。 如果我使用 earlyFiringTriggers,当两个元素都连接时,我看到连接的数据是 output,然后是 window 的末尾。 我也想避免这种情况,但我无法正确配置我的 window 方法。

有什么建议吗?

这种连接最好在全局 window 中实现,使用 state 缓冲连接的两侧,并使用计时器清理 state。 它可以泛化,因此在https://issues.apache.org/jira/browse/BEAM-7386 中将其作为功能请求进行跟踪。 https://github.com/apache/beam/pull/15275有一个正在审查/开发中的实现。 您可以使用有关错误和拉取请求的详细信息来完成为您简化和定制的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM