使用Apache Beam将插入式广告扩展到BigQuery时如何指定insertId

时间:2019-01-09 12:52:22

标签: java google-cloud-platform google-bigquery apache-beam apache-beam-io

BigQuery支持重复数据删除以进行流插入。如何通过Apache Beam使用此功能?

https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

  

为帮助确保数据一致性,可以为每个插入的行提供insertId。 BigQuery至少会记住此ID一分钟。如果您尝试在该时间段内流传输相同的行集,并且设置了insertId属性,则BigQuery将使用insertId属性来尽最大努力消除重复数据。您可能必须重试插入,因为在某些错误情况下(例如系统与BigQuery之间的网络错误或BigQuery中的内部错误),无法确定流插入的状态。如果您重试插入,请对相同的行集使用相同的insertId,以便BigQuery可以尝试对数据进行重复数据删除。有关更多信息,请参阅对流插入进行故障排除。

我在Java文档中找不到此类功能。 https://beam.apache.org/releases/javadoc/2.9.0/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html

this question中,他建议在TableRow中设置insertId。这是正确的吗?

https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/TableRow.html?is-external=true

BigQuery客户端库具有此功能。

https://googleapis.github.io/google-cloud-java/google-cloud-clients/apidocs/index.html?com/google/cloud/bigquery/package-summary.html https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/InsertAllRequest.java#L134

2 个答案:

答案 0 :(得分:1)

  • Pub / Sub + Beam / Dataflow + BigQuery :应该保证“恰好一次”,您不必为此担心。现在,当您要求Dataflow使用FILE_LOADS而非STREAMING_INSERTS插入BigQuery时,这种保证会更强。

  • Kafka + Beam / Dataflow + BigQuery :如果可以从Kafka多次发出一条消息(例如,如果生产者重试插入),则需要注意-复制。无论是在BigQuery(根据您的评论,目前已实现)中,还是在具有.apply(Distinct.create())转换的数据流中。

答案 1 :(得分:1)

正如Felipe在评论中提到的那样,似乎Dataflow已经在使用insertId本身来实现“恰好一次”。因此我们无法手动指定insertId。