Google cloud dataflow 特定版本:PubSub/Dataflow对无界数据的确认

Google cloud dataflow 特定版本:PubSub/Dataflow对无界数据的确认,google-cloud-dataflow,apache-beam,google-cloud-pubsub,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,我有一个项目,它有一个ApacheBeam管道,依赖项的设置方式必须使用PubSub的0.20.0-beta版本。 此管道一直在运行(无边界) [+]问题: PubSub消息大约每30分钟重复一次 [+]我所尝试的: 我读过很多解决方案,其中提到了Dataflow runner是如何设置检查点的,在这些检查点中进行确认的。我还了解到,使用诸如GroupByKey之类的PTTransform可以更快地确认这些消息。因此,我尝试了按键打开窗口、触发和分组,但我仍然从PubSub重复收到消息 [+]问

我有一个项目,它有一个ApacheBeam管道,依赖项的设置方式必须使用PubSub的0.20.0-beta版本。 此管道一直在运行(无边界)

[+]问题: PubSub消息大约每30分钟重复一次

[+]我所尝试的: 我读过很多解决方案,其中提到了Dataflow runner是如何设置检查点的,在这些检查点中进行确认的。我还了解到,使用诸如GroupByKey之类的PTTransform可以更快地确认这些消息。因此,我尝试了按键打开窗口、触发和分组,但我仍然从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)
            );
.apply(“Listen_To_PubSub”,PubsubIO.readStrings().fromSubscription(subscription))
.apply(“Windowing”,Window.into(Window).触发(AfterProcessingTime.pastFirstElementInPane().plusDelayOf(timeLimit))。允许延迟(持续时间为0).丢弃FiredPanes())
.apply(“DeleteFromBQ”,ParDo.of(new DeleteFromBQ()))
.apply(“映射”,ParDo.of(new Mapping())
.apply(“GroupByKey”,GroupByKey.create())
.apply(“确认”,第页,共页(新分组())
.apply(“DoSomething1”,ParDo.of(new DoSomething1()))
.apply(“flatte_Iterable”,flatte.iterables())
.apply(“DoSomething2”,ParDo.of(new DoSomething2()))
.apply(“DoSomething3”,第页,共页(新的DoSomething3())
.apply(“DoSomething4”,第页,共页(新的DoSomething4())
.apply(“Write_To_BigQuery”,BigQueryIO.writeTableRows()
。至(输出)
.withSchema(schema)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE\u NEVER)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.Write\u追加)
);

提前谢谢!欢迎您的任何意见

似乎由于应用了这么多变换,您超过了60秒的确认截止时间。看看我推荐用多长时间。我想你可能需要早点搬家


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

因此,我最终解决了这个问题,不得不将管道分成两部分

前半部分只听pubsubmessages |获取相关信息|写到另一个pubsub主题

第二部分侦听这些消息,然后在管道的其余部分使用这些消息中的信息


这种拆分不仅负责确认消息,还允许并行性更好地工作

是的,事实上我的管道需要一个超过一小时的确认截止时间。我正在使用GCP的“alpha”工具修改PubSub订阅的确认截止日期,但我不能超过600秒(10分钟)。有人知道我如何将ack截止时间更改为超过600秒吗?还有,Nasser,我尝试过更改机器类型,但它们确实没有我希望的效果,我正在执行的进程显然不需要超过1或2个内核(它们确实需要更多内存)。当我尝试更早地移动GroupByKey转换时,它不会改变任何东西。如果您需要更长的确认截止时间,可能最好使用推送订阅。请查看这篇文章,了解哪种订阅类型更适合您的用例。好的,我会检查一下。但是,窗口/触发不应该解决这个问题吗?我可以想象,一个处理时间超过10分钟(最大pubsub订阅确认截止日期)的管道是一个非常常见的用例,通过阅读Google文档,它肯定会提到它。那么,为什么窗口不划分PCollection呢?Nathan,查看推送订阅,我必须运行一个应用程序/服务器/webhook才能使其工作,这对项目来说是不必要的。还有其他建议吗?(我试过各种开窗方式,但都没有用)