Google cloud dataflow 当RuntimeException出现时,Google数据流是否正在重试DoFns?

Google cloud dataflow 当RuntimeException出现时,Google数据流是否正在重试DoFns?,google-cloud-dataflow,Google Cloud Dataflow,我们有一个简单的管道,在这里我们转换来自无界数据源的数据 在一个步骤中,当我们从外部服务充实数据时,有时会抛出RuntimeException(因为数据流太快(:p),而外部服务不知道这个特定的数据)。10秒后,它将被感知,并且不会抛出RuntimeException 考虑到这一点,我们完全不再使用故障保护,而是尝试依赖本机数据流机制(根据以下内容:) 但我们发现,这并没有真正起作用。我的意思是,捆绑包没有重新交付给DoFn,因此我们的接收器没有到达源的所有数据 此外,在本地运行时,此异常也会退

我们有一个简单的管道,在这里我们转换来自无界数据源的数据

在一个步骤中,当我们从外部服务充实数据时,有时会抛出RuntimeException(因为数据流太快(:p),而外部服务不知道这个特定的数据)。10秒后,它将被感知,并且不会抛出RuntimeException

考虑到这一点,我们完全不再使用故障保护,而是尝试依赖本机数据流机制(根据以下内容:)

但我们发现,这并没有真正起作用。我的意思是,捆绑包没有重新交付给DoFn,因此我们的接收器没有到达源的所有数据

此外,在本地运行时,此异常也会退出整个进程的执行

这仅仅是这种特殊类型的异常(RuntimeException)的问题吗?如何强制数据流重新处理捆绑包

更新 出现异常的
DoFn

@DoFn.ProcessElement
public void processElement(ProcessContext c) {
    String txHash = c.element().getHash();
    try {
        LOG.info("TransformId: " + txHash);

        // here the RuntimeException is thrown
        throw new new RuntimeException

        }
    } catch (Exception e) {
        LOG.error("Exception during processing id: " + txHash, e);
        throw e;
    }
}
和日志:

2018-02-22 17:15:53.633 CET
Receiver: 00ff ( this is source, we are receiving id"
2018-02-22 17:15:53.634 CET
TransformId: 00ff ( beginning of the DoFn )
2018-02-22 17:15:53.634 CET
getTxRest invoked: 00ff ( the enriching service )
2018-02-22 17:15:53.638 CET
Exception during processing id: 00ff
2018-02-22 17:15:53.834 CET
Uncaught exception: ( and here are the details that the log name is: "xxx/logs dataflow.googleapis.com%2Fworker"  )

为什么我说这是不重试?因为此id
00ff
在其他地方的日志中不存在。

可能有两个原因:

  • 如果
    getHash()
    是不确定的
  • 如果您正在从一个自定义
    无界数据源
    读取数据,该数据源至少不提供一次读取。例如,源可能根本不支持确认,或者可能在收到记录时立即错误地确认记录,而不是在
    finalizeCheckpoint()
在这种情况下,第二种可能性更大。重试捆绑包时,它会重试从源读取,而源不会再次返回此记录


如果无法修复源,作为一种解决方法,您可以通过
Reshuffle.viaramonkey()
-将数据从源中传递出去,这将有效地暂时实现数据,因此重试只涉及处理而不涉及读取,以牺牲较小的性能开销为代价。

请包含一些代码,并详细说明如何推断捆绑包没有重新交付?我更新了问题。谢谢。getHash()的作用是什么?是否具有确定性(当重试同一元素时,getHash()是否可能返回不同的值)?另外:您从哪个源读取?理论上,错误实现的无界源可能会导致这种情况。getHash在类DTO对象上调用,因此它是幂等的。关于源代码,它与sdk源代码中的JmsIO几乎相同。我们有一个主题,所以一次只有一个读者(避免重复内容)。