管道执行期间出错:超出允许的最大偏差

时间:2015-06-15 06:55:53

标签: google-cloud-dataflow

我星期五执行了一个管道,它在周末执行但周日有很多以下错误:

14 jun. 2015 14:40:51
(6f550257718f53da): Exception: java.lang.IllegalArgumentException: Timestamp 2015-06-14T12:40:48.731Z exceeds allowed maximum skew.
com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:119)
com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:69)
com.google.cloud.dataflow.sdk.util.DoFnRunner$DoFnProcessContext.checkTimestamp(DoFnRunner.java:502)
com.google.cloud.dataflow.sdk.util.DoFnRunner$DoFnProcessContext.outputWithTimestamp(DoFnRunner.java:465)
com.xtg.hub.dataflow.stats.common.Util$ExtractTimestampFn.processElement(Util.java:62)

在管道中有5分钟的FixedWindow,在为此FixedWindow执行.apply之前,我将TimeStamp分配给PCollection的每个元素:

c.outputWithTimestamp(c.element(), Instant.now());

我做错了吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

数据流中当前不支持调用outputWithTimestamp,其时间戳小于输入元素的时间戳。由于工作人员之间的时钟偏差,将时间戳设置为Instant.now()可能会尝试向后移动时间戳。

编辑:例如,你可以这样做:

Instant now = Instant.now();
c.outputWithTimestamp(c.element(),
                      now.isAfter(c.timestamp()) ? now : c.timestamp());