我正在编写一个从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
块。有没有人经历过类似的行为?
答案 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