Google cloud dataflow 云数据流窗口触发器覆盖关闭窗口中的值

Google cloud dataflow 云数据流窗口触发器覆盖关闭窗口中的值,google-cloud-dataflow,google-cloud-pubsub,google-cloud-bigtable,Google Cloud Dataflow,Google Cloud Pubsub,Google Cloud Bigtable,我正在编写一个数据流(Beam SDK 2.0.0),它从发布/订阅中读取数据,对窗口中的元素进行计数,然后将计数作为时间序列存储在BigTable中。车窗的持续时间固定为1分钟 我的意图是使用触发器每秒更新当前窗口的值,以便实时更新当前时间窗口 但这似乎不起作用。该值每秒正确更新一次,但一旦数据流在下一分钟开始工作,第一个值将更新为零。所以基本上只有我的最后一个值是正确的,其余的都是零 Pipeline pipeline = Pipeline.create(options); PCollec

我正在编写一个数据流(Beam SDK 2.0.0),它从发布/订阅中读取数据,对窗口中的元素进行计数,然后将计数作为时间序列存储在BigTable中。车窗的持续时间固定为1分钟

我的意图是使用触发器每秒更新当前窗口的值,以便实时更新当前时间窗口

但这似乎不起作用。该值每秒正确更新一次,但一旦数据流在下一分钟开始工作,第一个值将更新为零。所以基本上只有我的最后一个值是正确的,其余的都是零

Pipeline pipeline = Pipeline.create(options);

PCollection<String> live = pipeline
        .apply("Read from PubSub", PubsubIO.readStrings()
        .fromSubscription("projects/..."))
        .apply("Window per minute",
            Window
                .<String>into(FixedWindows.of(Duration.standardMinutes(1)))
                .triggering(Repeatedly
                    .forever(AfterProcessingTime
                        .pastFirstElementInPane()
                        .plusDelayOf(Duration.standardSeconds(1)))                                         
                    .orFinally(AfterWatermark.pastEndOfWindow()))
                .accumulatingFiredPanes()
                .withAllowedLateness(Duration.ZERO)
            );
Pipeline-Pipeline=Pipeline.create(选项);
PCollection live=管道
.apply(“从PubSub读取”,PubsubIO.readStrings()
.fromSubscription(“projects/…))
.apply(“每分钟窗口数”,
窗口
.into(固定窗口的持续时间标准分钟数(1)))
.触发(重复)
.forever(后处理时间)
.pastFirstElementInPane()
.plusDelayOf(持续时间.standardSeconds(1)))
.orFinally(AfterWatermark.pastEndOfWindow())
.累积燃烧烷()
.允许延迟(持续时间为零)
);

我尝试过使用触发代码,但没有任何帮助。我现在唯一的选择是删除整个
.trigger
块。有人经历过类似的行为吗?

在向谷歌报告我的问题后,他们在Beam SDK中发现了一些导致这种情况的问题。有关这些链接的更多详细信息:

当EOW和GC定时器同时触发时(允许非零延迟),我们没有注意到它是最后一个窗格:

如果处理时间计时器与GC计时器一起出现,则不会正确忽略它们:

处理时间计时器仅被解释为GC计时器,完全不正确地比较来自不同时域的时间戳: