首页 文章

在Apache Beam中按顺序触发窗口

提问于
浏览
2

使用Apache Beam,我试图从Dataflow将指标发布到StackDriver . 但是,如果已经写入了t1的值,则StackDriver不允许为t0写入值,不幸的是我还没有在Apache Beam中找到一种方法来强制执行我希望以时间顺序发出窗口的事实(据我所知,t1的早期窗格仍然可以在t_的ON_TIME之前) .

所以我决定不允许任何迟到的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)));

"input"中的数据来自Pub / Sub,而StackDriverWriterFn中的代码几乎是逐字的:https://cloud.google.com/monitoring/custom-metrics/creating-metrics

当管道处于稳定状态时,这可以按预期工作 . 但是,如果由于某种原因,管道停机几分钟并重新启动,水印增长非常快,同时发现未处理的数据,并且多个窗口或多或少同时发出,这是不可预测的order,导致以下错误:

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]

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

2 回答

  • 0

    您是正确的,在时间t1结束的窗口的早期输出可以在窗口的任何输出之前输出,该窗口在稍后的时间t2结束 . 另外值得注意的是PCollections没有固有的顺序,并且运输不需要保持订单 .

    你也是正确的,如果你想将事件时间戳数据发送到一个要求它按顺序排列的系统,等到事件时间水印确保没有以后的数据是唯一的选择 .

    如果您提供有关如何使用StackDriver的更多详细信息,我可能会有更多关于如何最有效地使用它的内容 .

  • 0

    错误“INVALID_ARGUMENT:无法写入一个或多个TimeSeries”通常会导致多个并发写入程序将点添加到单个时间系列时,对于不同的编写器应该确实存在单独的TimeSeries,由受监视的资源或metric label区分 . Here它说“点的时间间隔必须晚于时间序列中已经存在的任何点 . ”

相关问题