使用outputWithTimestamp时,数据流管道正在处理期间丢弃事件

时间:2017-03-27 15:49:06

标签: google-cloud-dataflow

我有一个Cloud Dataflow管道,我可以在其中更改事件的原始时间戳,以模拟迟到事件的真实场景。但是,似乎我在管道的每次运行中都丢弃了一定比例的事件。在我的DoFn中,我使用以下代码来更改时间戳:

Instant newTimestamp = originalTimestamp.minus(Duration.standardMinutes(RANDOM.nextInt(15)));
c.outputWithTimestamp(KV.of(Integer.toString(RANDOM.nextInt(100)), element), newTimestamp);

1 个答案:

答案 0 :(得分:3)

问题很可能是由于您的DoFn步骤输出的时间戳早于处理步骤接收的时间戳减去允许的时间戳偏差。可抛出的异常可以在代码中找到:

https://github.com/GoogleCloudPlatform/DataflowJavaSDK/blob/master/sdk/src/main/java/com/google/cloud/dataflow/sdk/util/DoFnRunnerBase.java#L493

此行为记录在此处使用outputWithTimestamp:

https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/transforms/DoFn.Context#outputWithTimestamp-OutputT-org.joda.time.Instant-

虽然您可以覆盖getAllowedTimestampSkew函数,但也会记录这可能会导致水印计算出现不可预测的问题,因此只应在没有窗口/分组的情况下使用它。

https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/transforms/DoFn#getAllowedTimestampSkew--