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 版です。ご認識のうえ、ご利用ください。
- 参考 : Copy datasets
なお、データセットコピー機能の利用自体には料金は発生しませんが、コピーがリージョンをまたぐ場合は、データ転送料金が発生します。詳細は以下の公式ドキュメントをご参照ください。
ユースケース
データセットコピーは、以下のようなユースケースで用いられます。
- リージョンをまたいだバックアップ
- リージョンをまたいだデータの複製
- 本番環境を複製した開発環境の作成
BigQuery では bq コマンドやコンソール画面の操作によって、簡単にテーブルの複製を行うことができますが、通常のテーブル複製は同一リージョン内でしか行うことができません。また、データの INSERT 〜 SELECT も、同一リージョン内のテーブル間に限られます。データセットコピー機能を使うことで、簡単に、ノーコードで、リージョンをまたいだデータ複製・同期が可能です。
また、開発用途などの目的で大量のテーブルがあるデータセットをまるごと複製したい場合も、当機能を使うことで、容易に複製環境を作成することができます。
認証・認可
転送構成を作成する際、デフォルトでは、転送構成を作成したユーザーの Google アカウントの認証情報が使われます。その Google アカウントが、転送元のデータセットに対する読み取り権限と、転送先のデータセットに対する書き込み権限を持っている必要があります。
オプションで、サービスアカウントの認証情報を使うように指定できます。
ユーザーの Google アカウントで認証していると、ユーザーの退職や異動に伴いその Google アカウントが削除されたり、権限を失った場合、転送ジョブが失敗することになります。可能な限り、転送実行専用のサービスアカウントを作成して指定することが望ましいでしょう。
データ転送の挙動
当機能は、データセット単位でデータを複製します。Overwrite destination table
オプションを有効にするか無効にするかによって、挙動が異なります。
Overwrite destination table
オプションが有効の場合- 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
- その際、作成されるテーブルは、パーティション設定、クラスタ設定、カラムの Description などは同等になる
- 同名のテーブルが既に存在する場合、転送元のテーブルで転送先のテーブルを上書きする
- 転送先テーブル内のすべてのレコードが削除されてから、転送元のデータが転送先に移送される
- 削除されたレコードは、タイムトラベルストレージやフェイルセーフストレージ(参考)に残る
- 最後の転送実行から転送元テーブルが変更されていない場合、そのテーブルの処理はスキップされる
- 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
Overwrite destination table
オプションが無効の場合- 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
- その際、作成されるテーブルは、パーティション設定、クラスタ設定、カラムの Description などは同等になる
- 同名のテーブルが既に存在する場合、転送は行われない
- 転送元データセットに存在するテーブルと同名のテーブルが転送先データセットに存在しない場合、テーブルを新規作成し、内容を複製する
なお転送先データセットに、転送元データセットには存在しない名称のテーブルが存在する場合、そのテーブルに対しては何も行いません(削除されてしまうようなことはありません)。
注意点
ストレージ料金
当機能を使う場合に特に留意すべきなのは、以下の仕様です。
Overwrite destination table
オプションを有効にした場合、転送先テーブルのレコードがすべて削除され、転送元テーブルの内容で上書きされること(TRUNCATE => INSERT の挙動)- このときのデータ削除に伴い、タイムトラベルとフェイルセーフのストレージが増加すること
前者(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 のアップデート情報をつぶやいています。
Follow @y_sugi_it