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

标签 google-cloud-dataflow apache-beam stackdriver

使用 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/

相关文章:

python - BigQuery SQL 作业对 Dataflow 管道的依赖性

python - 数据流管道中的外部 Python 依赖项

scala - KafkaIO 检查点 - 如何向 Kafka 提交偏移量

java - 云数据流 Watermark 卡住并增加系统滞后

google-cloud-platform - 如何从 GCE 实例中的 Container-optimized OS 获取启动脚本日志?

java - 将 TupleTag 传递给 DoFn 方法

tensorflow - 如何使自定义指标可供 TFMA/Beam 使用?

python - 在 python Apache Beam 中打开一个 gzip 文件

logging - 如何在谷歌云的 Stackdriver 中获取 kubernetes 容器日志文件的内容?

kubernetes - 在 stackdriver 中监控 kubernetes pod 准备情况