Cloud Dataflow窗口触发器会覆盖关闭窗口中的值

时间:2017-06-15 20:16:15

标签: google-cloud-dataflow google-cloud-pubsub google-cloud-bigtable

我正在编写一个从Pub / Sub读取的Dataflow(Beam SDK 2.0.0),对窗口中的元素进行计数,然后将计数存储在BigTable中作为时间序列。窗户的固定时间为1分钟。

我的目的是使用触发器每秒更新当前窗口的值,以便在当前时间窗口上获得实时更新。

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

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)
            );

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

1 个答案:

答案 0 :(得分:1)

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

当EOW和GC定时器一起发射(非零允许迟到)时,我们没有注意到它是最后一个窗格:https://issues.apache.org/jira/browse/BEAM-2505

如果使用GC计时器,则不会正确忽略处理时间计时器:https://issues.apache.org/jira/browse/BEAM-2502

处理时间计时器只是被解释为GC计时器,完全错误地比较了来自不同时域的时间戳:https://issues.apache.org/jira/browse/BEAM-2504