🤔

BigQuery Storage Managed Writerに関して

2025/01/20に公開

bigQuery storage managed writerに関して

Storage Write API はストリームによって、BigQuery テーブルにデータが書き込まれる。複数のストリームで同じテーブルに同時に書き込むことができる。

デフォルトストリーム

Storage Write API は、継続的にデータを受信するために、デフォルト ストリームというのを備えており、書き込まれたデータを at-least-once 方式でbig queryに配信する形になっている。
データの復元生に優れており、スケーリング観点でも制限が低くスケーラブルな構成となっている。
APIのフローとしては、AppendRowsを使用してRPCの双方向通信を用いてdataを特定のdefault streamにappendする。

AppendRowsの仕様

rpc AppendRows(AppendRowsRequest) returns (AppendRowsResponse)

offsetが指定されている場合は、streamの終端に対してのoffsetがチェックされる。AppendRowsResponseにおいて、OUT_OF_RANGEが返される場合は現在のstreamの終端より後ろのoffsetに対してappendしようとしている。

ALREADY_EXISTSが返される場合は、ユーザーがすでに書き込みのあるstreamのoffsetに対して書き込みをしようとしているから。
retry方式も組み込まれており、同RPCコネクション内でoffsetを調整してretryすることも可能。
offsetが定義されていない場合は、streamの終端にappendされるようになる。

レスポンスはリクエストを送った順序と同じ順序で受け取ることができ、exactly once のような形で1成功リクエストに対して1レスポンスが返される。また、AppendRequestの処理が失敗した場合はレスポンス内にerrorの情報が埋め込まれる。

streamのタイプ

  • Committed streams: データはappendが成功後に即座に可視化可能
  • Buffered streams: データはFlushRows rpc (現在のoffsetにポイントしているcursorをさらに先のoffsetに動かすやつ)で可視化することができる
  • Pending streams: データはFinalizeWriteStream rpcの処理が完遂するまで可視化できない。また、streamはBatchCommitWriteStreams rpcによってcommitされる
    • Batch Commit Write Streamsに関して:
      • アトミック性を用いて同じparent tableに属しているpending streamに対してコミットする
      • streamはcommit前に完成していないといけなく、複数回commitすることはできない。streamがコミットされれば、stream内のデータはread operationに対応できる。

AppendRowsRequest

  • 10MB以下のサイズでないといけない
    • INVALID_ARGUMENTとして返される
  • fields (気になったやつだけ)
    • write_stream
      • write_streamはappendのオペレーションを判別する用
      • 最初のappendRowsのコネクションに対するリクエストに使われる
      • 連続するappendRowsのコネクションに対するリクエストに使われる(同じコネクションを使用して複数テーブルに書き込みをする場合)
      • 明示的なwriteストリームのフォーマット: projects/{project}/datasets/{dataset}/tables/{table}/streams/{id}
      • trace_id
        • clientによって設定されるIDでstreamを種別するためのもの。最初のリクエストの際のものしか考慮されない

AppendRowsResponse

  • fields (気になったものだけ)
    • updated_schema
      • schemaが更新された際に渡されるもの
    • row_errors[]
      • appendに失敗したもの
    • append_result
      • appendに成功したリザルト
    • error
      • already exists
      • out of range
      • invalid argument
      • aborted
      • internal

Discussion