BigQueryのinsertIdの話
tl;dr
- insertId付けると、Streaming Insertの重複の可能性が下がる
- 重複排除はベストエフォートだよ
- 付けないメリットもあるよ
insertIdとは
https://cloud.google.com/bigquery/streaming-data-into-bigquery?hl=ja#dataconsistency
BigQueryでStreaming Insertを行う時、各行にinsertIdと呼ばれるidを設定する事が可能です。 insertIdを設定することで、行が重複して挿入される事を ベストエフォートで回避します。
ただし、
- 重複を確認する期間を過ぎた 時
- (最短)一分
- Googleのインフラで何かが起きた時
- 「Google データセンターの接続が予期せず失われる稀なケースにおいては、自動重複排除を実行できない場合があります」
- (クライアント側の実装の問題で)内容が同じ行に別のinsertIdが入っている時
場合は、行が重複して挿入される可能性があります。
Next generation BigQuery streaming
2020/5月に「Next generation BigQuery streaming」なる機能がGAになりました。 https://cloud.google.com/bigquery/docs/release-notes?hl=ja#May_20_2020
無駄にカッチョイイ名前ですが、実はinsertIdが設定されないStreaming Insertの事です。
わざわざ重複排除(の可能性)を止めて何が嬉しいかというと、
- クオータが優しくなる
- 例えば「秒あたりの最大バイト数」は 100MB/秒から 1GB/秒 になる
- 早くなる(らしい)
- Apache Beamのチケットで、Googleの人(たぶん)が「If user choose to opt out of using insert ids, they could potentially to be opt into using our current new streaming backend which gives higher speed」って書いてます
- BigQuery側のドキュメントは不明
ようなメリットがあります。
なお、Next generation BigQuery streamingはどこでも使えるわけではなく、2020/5月時点では
- us(マルチリージョン)
- eu(マルチリージョン)
- asia-northeast1(リージョン)
だけです。