使用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之前对它们进行排序。
答案 0 :(得分:0)
您是正确的,可能会在早于时间 t2 的窗口的任何输出之前输出早于时间 t1 的窗口的输出。同样值得注意的是,PCollections没有固有的顺序,并且不需要保留顺序来进行运输。
如果您想将带有事件时间戳的数据发送到要求井井有条的系统,那是正确的,等到事件时间水印确保没有以后的数据是唯一的选择。
如果您提供有关如何正确使用StackDriver的更多详细信息,我可能还有更多关于如何最有效地使用它的信息。
答案 1 :(得分:0)
错误“ INVALID_ARGUMENT:无法写入一个或多个TimeSeries”最常见的结果是,多个并发编写者将一个点添加到单个时间序列中,其中对于不同的编写者而言确实应该有单独的TimeSeries,以监视的资源或metric label。 Here表示“该点的时间间隔必须晚于时间序列中已经存在的任何点。”