Google cloud dataflow 在Apache Beam中按顺序触发窗口

Google cloud dataflow 在Apache Beam中按顺序触发窗口,google-cloud-dataflow,apache-beam,stackdriver,Google Cloud Dataflow,Apache Beam,Stackdriver,使用ApacheBeam,我试图将度量从数据流发布到StackDriver中。然而,如果t1的值已经被写入,StackDriver不允许写入t0的值,不幸的是,我还没有在Apache Beam中找到一种方法来强制执行这样一个事实,即我希望窗口按时间顺序发出(据我所知,t1的早期窗格仍然可以在t0的ON_时间之前发出) 因此,我决定不允许任何迟到进入1分钟的修复窗口,如下所示: input .apply("IntoOneMinFixedWindow", Window.<T>into

使用ApacheBeam,我试图将度量从数据流发布到StackDriver中。然而,如果t1的值已经被写入,StackDriver不允许写入t0的值,不幸的是,我还没有在Apache Beam中找到一种方法来强制执行这样一个事实,即我希望窗口按时间顺序发出(据我所知,t1的早期窗格仍然可以在t0的ON_时间之前发出)

因此,我决定不允许任何迟到进入1分钟的修复窗口,如下所示:

input
  .apply("IntoOneMinFixedWindow", Window.<T>into(FixedWindows.of(Duration.standardMinutes(1)))
    .withAllowedLateness(Duration.ZERO)
    .discardingFiredPanes())
  .apply("GloballyCount", Combine.globally(Count.<T>combineFn()).withoutDefaults())
  .apply("StackDriverWriterFn", ParDo.of(new StackDriverWriterFn(metricName)));

我想知道我是否遗漏了什么,或者我真的被迫以某种方式缓冲样本,并在写入StackDriver之前对它们进行排序。

您是正确的,在时间t1结束的窗口的早期输出可能在稍后时间t2结束的窗口的任何输出之前输出。同样值得注意的是,pcollection没有固有的顺序,传输不需要保持顺序

如果要将事件时间戳数据发送到要求其处于有序状态的系统,则等待事件时间水印确保没有后续数据是唯一的选项,这也是正确的


如果您提供更多关于如何正确使用StackDriver的详细信息,我可能需要补充更多关于如何最有效地使用它的信息。

错误“无效参数:无法写入一个或多个TimeSeries”最典型的结果是,当多个并发写入程序向单个时间序列添加点时,不同的写入程序实际上应该是独立的,通过受监视的资源或一个时间序列来区分。它说“该点的时间间隔必须晚于时间序列中已经存在的任何点。”

Hi Kenn,我已经扩展了原始问题,以提供有关我的用例的更多细节,并提供了一个代码片段。正如我在上面所阐述的,等待水印也没有帮助,至少在管道处理一些旧数据时没有帮助。
com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: One or more TimeSeries could not be written: Points must be written in order. One or more of the points specified had an older end time than the most recent point.: timeSeries[0]