数据流/ Apache Beam:如何从@FinishBundle访问状态?

时间:2019-12-16 08:15:36

标签: google-cloud-dataflow apache-beam

我们的管道缓冲事件,并每500个事件进行一次外部提取(用于充实)。当计时器触发时,计时器触发时,将处理这些事件。当然,当您有503个事件,将有3个未丰富的事件。

从实验中我们了解到@FinishBundle总是在计时器之前被调用。甚至看来,捆绑包的结果在计时器执行之前已已提交(检查点?)。如果我们可以从@FinishBundle访问状态并对这些最后的事件进行充实,则它们将成为已提交捆绑包的一部分。

我相信这将解决我们的恰好一次问题:目前,计时器也需要提取并在重新执行时再次执行。当我们可以在@FinishBundle中调整状态时,就不再需要获取,并且当计时器重新执行时,将从状态开始。

显然,无法通过@FinishBundle函数访问状态,因为以下内容会导致错误:

@FinishBundle
public void finishBundle(FinishBundleContext c,
                         @StateId("buffer") BagState<AwesomeEvent> bufferState) {
            LOG.info("--- FINISHBUNDLE CALLED ---");
            // TODO: ENRICHMENT
            LOG.info("--- FINISHBUNDLE DONE ---");
}

我做错什么了吗,还是有另一种方法可以从该功能访问状态?

此外,我是否对计时器行为进行了正确的评估?

0 个答案:

没有答案