BigQuery Data Transfer Serviceのデータセットコピーを解説

記事タイトルとURLをコピーする

G-gen の杉村です。当記事では、BigQuery Data Transfer Service で提供される、データセットコピー機能を解説します。

BigQuery Data Transfer Service とは

BigQuery Data Transfer Service は、外部から BigQuery へのデータ転送を自動化する Google Cloud(旧称 GCP)のフルマネージドサービスです。フルマネージドサービスであるため、基盤の準備やメンテナンスは必要ありません。

以下のようなデータソースから、BigQuery へのデータ転送を簡単に自動化できます(一部のみ抜粋)。

転送元 データ形式
Cloud Storage CSV, JSON, Avro, Parque 等
Amazon S3 CSV, JSON, Avro, Parque 等
Azure Blob Storage CSV, JSON, Avro, Parque 等
Google Ads Google 広告レポート
YouTube 各種レポート
Amazon Redshift テーブル

BigQuery Data Transfer Service では転送構成(Transfer Config)という設定オブジェクトを作成して、データ転送元、転送先、繰り返しスケジュールを定義します。繰り返しスケジュールでは、日次実行、月次実行、オンデマンドなど、自動実行の頻度を設定できます。

BigQuery Data Transfer Service は原則、無料で利用できます。ただし、Google Play など一部の転送元を利用する場合のみ料金が発生するほか、Amazon Web Services(AWS)側の外向きデータ転送料金などは発生しますので、ご注意ください。

データセットコピー機能とは

当記事で紹介するデータセットコピー(Dataset Copy)機能とは、BigQuery Data Transfer Service の機能の1つです。データの転送元として BigQuery データセットを指定し、転送先として他の BigQuery データセットとして転送構成を定義することができます。

データセットコピー機能では、異なる Google Cloud プロジェクト間や、異なるリージョン間でもデータを複製できます。

2024年3月現在、当機能は Beta 版です。ご認識のうえ、ご利用ください。

なお、データセットコピー機能の利用自体には料金は発生しませんが、コピーがリージョンをまたぐ場合は、データ転送料金が発生します。詳細は以下の公式ドキュメントをご参照ください。

ユースケース

データセットコピーは、以下のようなユースケースで用いられます。

  • リージョンをまたいだバックアップ
  • リージョンをまたいだデータの複製
  • 本番環境を複製した開発環境の作成

BigQuery では bq コマンドやコンソール画面の操作によって、簡単にテーブルの複製を行うことができますが、通常のテーブル複製は同一リージョン内でしか行うことができません。また、データの INSERT 〜 SELECT も、同一リージョン内のテーブル間に限られます。データセットコピー機能を使うことで、簡単に、ノーコードで、リージョンをまたいだデータ複製・同期が可能です。

また、開発用途などの目的で大量のテーブルがあるデータセットをまるごと複製したい場合も、当機能を使うことで、容易に複製環境を作成することができます。

認証・認可

転送構成を作成する際、デフォルトでは、転送構成を作成したユーザーの Google アカウントの認証情報が使われます。その Google アカウントが、転送元のデータセットに対する読み取り権限と、転送先のデータセットに対する書き込み権限を持っている必要があります。

オプションで、サービスアカウントの認証情報を使うように指定できます。

ユーザーの Google アカウントで認証していると、ユーザーの退職や異動に伴いその Google アカウントが削除されたり、権限を失った場合、転送ジョブが失敗することになります。可能な限り、転送実行専用のサービスアカウントを作成して指定することが望ましいでしょう。

データ転送の挙動

当機能は、データセット単位でデータを複製します。Overwrite destination table オプションを有効にするか無効にするかによって、挙動が異なります。

  • Overwrite destination table オプションが有効の場合
    • 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
      • その際、作成されるテーブルは、パーティション設定、クラスタ設定、カラムの Description などは同等になる
    • 同名のテーブルが既に存在する場合、転送元のテーブルで転送先のテーブルを上書きする
      • 転送先テーブル内のすべてのレコードが削除されてから、転送元のデータが転送先に移送される
      • 削除されたレコードは、タイムトラベルストレージやフェイルセーフストレージ(参考)に残る
      • 最後の転送実行から転送元テーブルが変更されていない場合、そのテーブルの処理はスキップされる
  • Overwrite destination table オプションが無効の場合
    • 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
      • その際、作成されるテーブルは、パーティション設定、クラスタ設定、カラムの Description などは同等になる
      • 同名のテーブルが既に存在する場合、転送は行われない

なお転送先データセットに、転送元データセットには存在しない名称のテーブルが存在する場合、そのテーブルに対しては何も行いません(削除されてしまうようなことはありません)。

注意点

ストレージ料金

当機能を使う場合に特に留意すべきなのは、以下の仕様です。

  1. Overwrite destination table オプションを有効にした場合、転送先テーブルのレコードがすべて削除され、転送元テーブルの内容で上書きされること(TRUNCATE => INSERT の挙動)
  2. このときのデータ削除に伴い、タイムトラベルフェイルセーフのストレージが増加すること

前者(1.)については、転送元と転送先のデータの同期を目的としていれば、これ自体は問題ではありません。後者(2.)が問題です。

データは削除されると、論理バックアップを目的としてタイムトラベルストレージに移行されます。そのため、データ移送のたびにタイムトラベルストレージが増えることになります。タイムトラベルストレージの保持期間は2〜7日間から設定できます。保持期間が終了すると、データはフェイルセーフストレージに移行します。フェイルセーフストレージの保持期間は7日間で固定です。また、どちらのストレージ保持期間もゼロにすることはできません。

データセットのストレージの課金モデルを Physical Storage(物理ストレージ。圧縮後の実データ容量に対する課金)にしている場合、「タイムトラベル」と「フェイルセーフ」のストレージは課金対象になります。データセットコピーを高い頻度で行い、またテーブルのデータサイズが大きいと、その分、毎回のデータ移送で削除されるデータの量が大きくなり、多額の課金が発生してしまうおそれがあります。

同期したいデータセットのサイズが大きい場合は、データセットコピー機能ではなく、差分のみを転送する SQL を開発して Scheduled Query で定期実行するなど、代替案も検討しましょう。

なお、データセットの課金モデルが Logical Storage(論理ストレージ。圧縮前の額面データサイズに対する課金)であれば、タイムトラベルとフェイルセーフストレージに対しては課金されません。

複製の対象外のリソース

以下のリソースは、データセットコピー機能では複製されません。

  • 外部テーブル
  • ビュー
  • ルーチン(ストアドプロシージャ、UDF、テーブル関数)
  • (コピーがリージョンをまたぐ場合)CMEK で暗号化されたデータセット・テーブル

その他の詳細は制限等は、公式ドキュメントをご参照ください。

杉村 勇馬 (記事一覧)

執行役員 CTO / クラウドソリューション部 部長

元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。