[ 
https://issues.apache.org/jira/browse/BEAM-9492?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17548587#comment-17548587
 ] 

Danny McCormick commented on BEAM-9492:
---------------------------------------

This issue has been migrated to https://github.com/apache/beam/issues/20211

> Non-insertion errors in BigQueryIO.Write cause infinite loop
> ------------------------------------------------------------
>
>                 Key: BEAM-9492
>                 URL: https://issues.apache.org/jira/browse/BEAM-9492
>             Project: Beam
>          Issue Type: Bug
>          Components: io-java-gcp
>            Reporter: Joe Cullen
>            Priority: P3
>
> When streaming inserts into BigQuery using BigQueryIO.Write, if there is an 
> error other than a row insertion error (e.g. an IOException), BigQueryIO 
> assumes this must be a rate limit error, and so enters an [infinite loop of 
> retries|https://github.com/apache/beam/blob/master/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImpl.java#L785].
>  This is logical for rate limit errors, but other types of error may also 
> appear. 
>  
> One example is a "Not found" error for the BigQuery table. This can happen if 
> the table was originally created by BigQueryIO.Write (where CreateDisposition 
> is CREATE_IF_NEEDED), but has since been deleted (since created tables are 
> [cached|https://github.com/apache/beam/blob/master/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/CreateTables.java#L61]).
>  This may be more likely to happen in a long-term streaming job. The infinite 
> loop of retries does not help, as table creation is not retried, only row 
> insertion. The table either needs to be created with an external process, or 
> the pipeline needs to be restarted (thereby clearing the cache).
>  
> This can be the case regardless of setting InsertRetryPolicy, as these errors 
> are not insertion errors. As a result, we see logs such as "INFO: BigQuery 
> insertAll error, retrying: Not found: Table <project>:<dataset>.<table>" even 
> if we have set InsertRetryPolicy to "neverRetry()", which is confusing 
> behaviour. I expect similar issues to occur for other types of error (e.g. no 
> response from BigQuery API).
>  
> To recreate this issue, you can create a pipeline which inserts into BigQuery 
> using BigQueryIO, where the table does not exist beforehand but should be 
> created by BigQueryIO (i.e. CreateDisposition = CREATE_IF_NEEDED). Then mock 
> BigQueryServicesImpl's call to create the BigQuery table, causing no table to 
> be created (I did this in a brute force method by creating my own 
> BigQueryServicesImpl and feeding in using ".withTestServices()"). The 
> pipeline will enter an infinite loop, logging "INFO: BigQuery insertAll 
> error, retrying: Not found: Table <project>:<dataset>.<table>".
>  
> One suggestion to avoid this is to add another retry policy, one to control 
> retries for non-insertion errors. This could be optional for users and 
> effective 
> [here|https://github.com/apache/beam/blob/master/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryServicesImpl.java#L796].
>  An alternative/additional option could be to check for "table not found" 
> errors in this clause and if encountered, retry table creation before next 
> retrying insertion.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to