Apache Beam RetryTransientErrors / neverRetry不尊重未找到表的错误

时间:2018-11-20 11:44:43

标签: google-cloud-dataflow apache-beam

下面是我用来将数据写入BigQuery的代码

WriteResult result = formattedData.get(successRows).setCoder(TableRowJsonCoder.of())
            .apply("BQ SteamingInserts",BigQueryIO.writeTableRows()
                    .withMethod(BigQueryIO.Write.Method.STREAMING_INSERTS)
                    .withFormatFunction(new TableRowFormatFn())
                    .to(new DestinationMapper())
                    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
                    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_NEVER)
                    .withFailedInsertRetryPolicy(InsertRetryPolicy.retryTransientErrors())
                    .withoutValidation()
                    .withExtendedErrorInfo());

代码正在处理所有与模式相关的问题,但是当BigQuery中不存在表时,它将无限期地重试插入操作,从而导致管道停滞。

以下是在数据流中获得的错误

java.lang.RuntimeException: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
  "code" : 404,
  "errors" : [ {
    "domain" : "global",
    "message" : "Not found: Table analytics-and-presentation:trusted_layer_ods.wrong_table",
    "reason" : "notFound"
  } ],
  "message" : "Not found: Table analytics-and-presentation:trusted_layer_ods.wrong_table",
  "status" : "NOT_FOUND"
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这似乎是预期的行为,因为在流传输管道的情况下,Dataflow会无限期重新输入。在批处理管道中尝试4次后,该作业将失败。

您必须在代码中明确定义期望实现的目标。您可以从official Google Cloud Platform github page上的示例中获得启发。

使用当前代码,您必须确保提前创建表,以避免发生此错误。