特定版本:PubSub / Dataflow确认无边界数据

时间:2018-07-10 18:03:19

标签: google-cloud-dataflow apache-beam google-cloud-pubsub

我有一个项目,该项目的apache光束管道具有相关性,因此必须使用PubSub的0.20.0-beta版本。 该管道一直运行(无限制)。

[+]问题: 每30分钟左右就会重复发送一次PubSub消息。

[+]我尝试过的: 我已经阅读了许多解决方案,其中提到了Dataflow运行程序如何在其中进行确认的检查点。我还读过,使用诸如GroupByKey之类的PTransform可以更快地确认这些消息。因此,我尝试了按键进行窗口化,触发和分组,但是仍然从PubSub收到重复的消息。

[+]个问题: 我究竟做错了什么?为什么邮件未被接收? (如果我理解正确的话,直到流水线执行完之后它才会被确认?但是我的流水线花费了很长的时间,如何提前确认?)

这是特定于0.20.0-beta的“版本”错误,还是我应该能够在窗口和触发器中使用PubsubIO.Reader以便更早确认?

[+]代码:

窗口时间为10秒,PubSub ack截止期限为60秒。

     .apply("Listen_To_PubSub", PubsubIO.readStrings().fromSubscription(subscription))
            .apply("Windowing", Window.<String> into(window).triggering(AfterProcessingTime.pastFirstElementInPane().plusDelayOf(timeLimit)).withAllowedLateness(Duration.ZERO).discardingFiredPanes())
            .apply("DeleteFromBQ", ParDo.of(new DeleteFromBQ()))
            .apply("Mapping", ParDo.of(new Mapping()))
            .apply("GroupByKey", GroupByKey.<String,String>create())
            .apply("Acknowledge", ParDo.of(new Grouped()))
            .apply("DoSomething1", ParDo.of(new DoSomething1()))
            .apply("Flatten_Iterable", Flatten.iterables())
            .apply("DoSomething2", ParDo.of(new DoSomething2()))
            .apply("DoSomething3", ParDo.of(new DoSomething3()))
            .apply("DoSomething4", ParDo.of(new DoSomething4()))
            .apply("Write_To_BigQuery", BigQueryIO.writeTableRows()
                    .to(output)
                    .withSchema(schema)
                    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_NEVER)
                    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
            );

提前谢谢!任何输入表示赞赏。

2 个答案:

答案 0 :(得分:1)

好像您应用了许多变换一样,您超过了60秒的确认截止期限。要查看需要多长时间,我建议使用Logging Pipeline Messages。我认为您可能需要尽快提出确认。

您可以做的另一件事是使用更高的计算机类型以更快地处理消息。

答案 1 :(得分:1)

因此,我最终不得不通过将管道分成2个来解决了这个问题。

上半部分仅收听pubsubmessages |获取相关信息|写入另一个pubsub主题。

后半部分侦听这些消息,然后将这些消息中的信息用于管道的其余部分。

此拆分不仅负责确认消息,还使并行性可以更好地工作!