【问题标题】:Google Cloud Dataflow latency for real-time processing用于实时处理的 Google Cloud Dataflow 延迟
【发布时间】:2016-09-19 10:39:23
【问题描述】:

如果我们只是在高流量的 Google Dataflow 集群上进行简单的转换,并且每个“数据点”都很小,我们可以预期 Dataflow 的延迟有多低。

如果相关的话,我们计划使用间隔持续时间为 3 秒的会话窗口策略。

从一个数据点进入 Dataflow 到我们有结果输出的时间可以少于 2 秒,这是否现实?不到 1 秒?

【问题讨论】:

  • 我很困惑:您希望通过间隔持续时间为 3 秒的会话来窗口化,但您还希望在数据点到达后
  • 我们要比较两个数据流,一旦发现匹配,就不需要考虑其余数据了。
  • 我明白了。所以例如如果您有一个给定键的事件 A、B、C、D 的会话,那么您希望在每个事件到达后尽快触发 GBK,并分别进行 ParDo 过程 A、AB、ABC 和ABCD?
  • 是的,但从 ABC 开始。 (第一个触发器是“AfterPane.elementCountAtLeast(3)”)
  • 我明白了。然后,您对执行引擎本身引入的延迟感兴趣。请参阅stackoverflow.com/questions/34279297/…,它提出了类似的问题。

标签: google-cloud-dataflow


【解决方案1】:

我们一直在使用测试工具为我们的应用程序流运行基准测试,但随后又恢复为对当前开箱即用的 Google 提供的 PubSub 到 PubSub 模板流进行基准测试(请参阅:https://cloud.google.com/dataflow/docs/templates/overview,尽管此处未列出 -您可以从控制台创建它)。

我们的测试工具生成并发送了数百万条带有时间戳的数百字节的 JSON 格式消息,并比较了两端的延迟。 很简单:

测试发布者 -> PubSub -> 数据流 -> PubSub -> 测试订阅者。

对于单实例发布者和订阅者,我们改变了消息速率并试验了窗口和触发策略,看看我们是否可以改善平均延迟,但通常无法改善超过 1.7 秒每秒 1,500 - 2000 条消息的端到端(我们的典型工作负载)。

然后,我们从等式中删除了 Dataflow,只是将发布者直接连接到订阅者,发现相同消息速率的延迟通常约为 20-30 毫秒

恢复使用标准 PubSub 到 PubSub 数据流模板,我们看到端到端延迟与我们的应用程序数据流相似,约为 1.5 - 1.7 秒。

我们在管道中的不同点对时间戳进行采样,并将值写入多个自定义指标,并发现将消息添加到 PubSubIO.Read 的初始 PCollection 的平均延迟约为 380 毫秒,但最小值低至 25msec,由于启动开销,我们忽略了较高的值。但似乎有一个我们无法影响的开销。

我们尝试的窗口策略如下所示:

    Pipeline p = Pipeline.create(options);
    /*
     * Attempt to read from PubSub Topic
     */
    PCollectionTuple feedInputResults =
            p.apply(feedName + ":read", PubsubIO.readStrings().fromTopic(inboundTopic))
            .apply(Window.<String>configure()
                .triggering(Repeatedly
                    .forever(AfterWatermark.pastEndOfWindow()
                            .withEarlyFirings(
                                    AfterProcessingTime
                                            .pastFirstElementInPane()
                                            .plusDelayOf(Duration.millis(windowDelay)))
                                            // Fire on any late data
                                            .withLateFirings(AfterPane.elementCountAtLeast(windowMinElementCount))))
                    .discardingFiredPanes())
            .apply(feedName + ":parse", ParDo.of(new ParseFeedInputFn())
                        .withOutputTags(validBetRecordTag,
                        // Specify the output with tag startsWithBTag, as a TupleTagList.
                        TupleTagList.of(invalidBetRecordTag)));

【讨论】:

  • 只有在进行聚合时才需要窗口化。如果您只想将 Pub/Sub 转发到 Pub/Sub,则不需要任何窗口。
  • 同意。我们有一个管道,可以聚合和输出到多个接收器。该研究的一部分是评估端到端延迟的确定性。共识是,如果这是一个问题,那么选择不同的跑步者可能是谨慎的。这对我们来说不是问题。
猜你喜欢
  • 2018-02-09
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多