在Apache Beam中按顺序触发窗口

时间:2018-12-09 10:12:10

标签: google-cloud-dataflow apache-beam stackdriver

使用Apache Beam,我试图将指标从Dataflow发布到StackDriver。但是,如果已经编写了 t1 的值,StackDriver不允许为 t0 编写一个值,不幸的是,我还没有在Apache Beam中找到方法来强制执行我希望窗口按时间顺序发出的事实(据我所知, t1 的早期窗格仍可以在 t0 的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)));

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

当管道处于稳定状态时,这将按预期工作。但是,如果由于某种原因,管道关闭了几分钟并重新启动,则水印会快速增长,而同时发生未处理数据的追赶,并且多个窗口同时或多或少地发出,这是不可预测的订单,从而导致以下错误:

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 :(得分:0)

您是正确的,可能会在早于时间 t2 的窗口的任何输出之前输出早于时间 t1 的窗口的输出。同样值得注意的是,PCollections没有固有的顺序,并且不需要保留顺序来进行运输。

如果您想将带有事件时间戳的数据发送到要求井井有条的系统,那是正确的,等到事件时间水印确保没有以后的数据是唯一的选择。

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

答案 1 :(得分:0)

错误“ INVALID_ARGUMENT:无法写入一个或多个TimeSeries”最常见的结果是,多个并发编写者将一个点添加到单个时间序列中,其中对于不同的编写者而言确实应该有单独的TimeSeries,以监视的资源或metric labelHere表示“该点的时间间隔必须晚于时间序列中已经存在的任何点。”