我有一个项目,该项目的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)
);
提前谢谢!任何输入表示赞赏。
答案 0 :(得分:1)
好像您应用了许多变换一样,您超过了60秒的确认截止期限。要查看需要多长时间,我建议使用Logging Pipeline Messages。我认为您可能需要尽快提出确认。
您可以做的另一件事是使用更高的计算机类型以更快地处理消息。
答案 1 :(得分:1)
因此,我最终不得不通过将管道分成2个来解决了这个问题。
上半部分仅收听pubsubmessages |获取相关信息|写入另一个pubsub主题。
后半部分侦听这些消息,然后将这些消息中的信息用于管道的其余部分。
此拆分不仅负责确认消息,还使并行性可以更好地工作!