使用 Apache Beam,我尝试将指标从 Dataflow 发布到 StackDriver。但是,如果 t1 的值已经写入,StackDriver 不允许为 t0 写入值,不幸的是我还没有在 Apache Beam 中找到方法强制执行我希望窗口按时间顺序发出的事实(据我所知,t1 的 EARLY Pane 仍可能在 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 之前对它们进行排序。
最佳答案
您是正确的,在时间 t1 结束的窗口的早期输出可能先于在稍后时间 t2 结束的窗口的任何输出之前输出。同样值得注意的是,PCollections 没有固有的顺序,并且传输不需要保持顺序。
您也是正确的,如果您想将带有事件时间戳的数据发送到要求它按顺序排列的系统,等待直到事件时间水印确保不会有以后的数据是唯一的选择。
如果您提供更多有关您如何使用 StackDriver 的详细信息,我可能会添加更多关于如何最有效地使用它的信息。
关于google-cloud-dataflow - 在 Apache Beam 中按顺序触发窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53691263/