首页 > 解决方案 > GroupByKey 不更新很长的 PTransform 与窗口

问题描述

我正在研究在 Google Cloud Dataflow 中运行的流式 Java Apache Beam (2.13.0) 管道。我有一个长时间运行的 PTransform(对于单个输入,它做了很多工作,输出多个输出并且可能需要超过 10 分钟)。

我想将处理的早期结果返回给用户。之后我有一个窗口和组合步骤。早期触发器似乎不适用于长时间运行的 PTransform。在 PTransform 处理完元素(而不是返回早期结果)之后,Combine 步骤会输出元素。

我尝试了许多不同的早期窗口功能。例如,我尝试过永久元素计数触发器,但它不起作用。同样适用于永远处理基于时间的触发器(例如,每 10 秒处理一次)。我尝试过 GlobalWindows、Fixed Windows、Session Windows 等。

这是我正在做的粗略伪代码。

p.apply(PubsubIO.readStrings().fromSubscription(options.getInput()));
 .apply(FlatMapElements.via(new LongRunningCalculation()))
 .apply(<I've tried a variety of window functions>)
 .apply(Combine.perKey(new SumMetrics()))
 .apply(DatastoreIO.v1().write().withProjectId(options.getProject()));

对于 Window 函数,我尝试了许多不同的 Window 函数,看看是否可以提前返回。我不能让它早点回来。

这是一个基本的。

Window.into(new GlobalWindows())
 .triggering(Repeatedly.forever(AfterPane.elementCountAtLeast(10)))
 .withAllowedLateness(Duration.ZERO)
 .discardingFiredPanes());

即使对于这个,即使Window已经添加了>>10个元素,Combine步骤中的GroupBy也不会输出任何行。

预期:如果我有一个长期运行的 PTransform,我仍然希望早期触发器仍然会触发。

实际:我似乎无法让早期触发器起作用。

有什么建议吗?

标签: apache-beam

解决方案


推荐阅读